summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh Stone <jistone@redhat.com>2009-03-25 17:25:06 -0700
committerJosh Stone <jistone@redhat.com>2009-03-25 17:40:26 -0700
commita5e8d632f443c6a882dcabc669236dc4798b1fd7 (patch)
tree9157ba6a3f5a4daeffdf40b8eca07a75a6476195
parent2a8c27f6bfdf2e7962def6fc8729ebb5fb54c701 (diff)
downloadsystemtap-steved-a5e8d632f443c6a882dcabc669236dc4798b1fd7.tar.gz
systemtap-steved-a5e8d632f443c6a882dcabc669236dc4798b1fd7.tar.xz
systemtap-steved-a5e8d632f443c6a882dcabc669236dc4798b1fd7.zip
Add the kernel tree's git revision to the hash
To better support kernel developers who work out of a single source tree, this adds the git HEAD revision to our caching hash.
-rw-r--r--hash.cxx4
-rw-r--r--util.cxx27
-rw-r--r--util.h1
3 files changed, 32 insertions, 0 deletions
diff --git a/hash.cxx b/hash.cxx
index c9121641..649e7ec0 100644
--- a/hash.cxx
+++ b/hash.cxx
@@ -95,6 +95,10 @@ get_base_hash (systemtap_session& s, hash& h)
h.add_file(s.kernel_build_tree + "/include/linux/version.h");
h.add_file(s.kernel_build_tree + "/include/linux/utsrelease.h");
+ // If the kernel is a git working directory, then add the git HEAD
+ // revision to our hash as well.
+ h.add(git_revision(s.kernel_build_tree));
+
// Hash runtime path (that gets added in as "-R path").
h.add(s.runtime_path);
diff --git a/util.cxx b/util.cxx
index 7d191cd2..68cc27f7 100644
--- a/util.cxx
+++ b/util.cxx
@@ -248,4 +248,31 @@ const string cmdstr_quoted(const string& cmd)
return quoted_cmd;
}
+
+string
+git_revision(const string& path)
+{
+ string revision = "(not-a-git-repository)";
+ string git_dir = path + "/.git/";
+
+ struct stat st;
+ if (stat(git_dir.c_str(), &st) == 0)
+ {
+ string command = "git --git-dir=\"" + git_dir
+ + "\" rev-parse HEAD 2>/dev/null";
+
+ char buf[50];
+ FILE *fp = popen(command.c_str(), "r");
+ if (fp != NULL)
+ {
+ char *bufp = fgets(buf, sizeof(buf), fp);
+ int rc = pclose(fp);
+ if (bufp != NULL && rc == 0)
+ revision = buf;
+ }
+ }
+
+ return revision;
+}
+
/* vim: set sw=2 ts=8 cino=>4,n-2,{2,^-2,t0,(0,u0,w1,M1 : */
diff --git a/util.h b/util.h
index 2884e021..d385be02 100644
--- a/util.h
+++ b/util.h
@@ -12,6 +12,7 @@ void tokenize(const std::string& str, std::vector<std::string>& tokens,
const std::string& delimiters);
std::string find_executable(const std::string& name);
const std::string cmdstr_quoted(const std::string& cmd);
+std::string git_revision(const std::string& path);
// stringification generics