1aaebf433SRyan Anderson#!/usr/bin/perl 2aaebf433SRyan Anderson# Copyright 2004 - Ryan Anderson <ryan@michonline.com> GPL v2 3aaebf433SRyan Anderson 4aaebf433SRyan Andersonuse strict; 5aaebf433SRyan Andersonuse warnings; 6aaebf433SRyan Andersonuse Digest::MD5; 7aaebf433SRyan Andersonrequire 5.006; 8aaebf433SRyan Anderson 9aaebf433SRyan Andersonif (@ARGV != 1) { 10aaebf433SRyan Anderson print <<EOT; 11aaebf433SRyan AndersonUsage: setlocalversion <srctree> 12aaebf433SRyan AndersonEOT 13aaebf433SRyan Anderson exit(1); 14aaebf433SRyan Anderson} 15aaebf433SRyan Anderson 16aaebf433SRyan Andersonmy ($srctree) = @ARGV; 17aaebf433SRyan Andersonchdir($srctree); 18aaebf433SRyan Anderson 19aaebf433SRyan Andersonmy @LOCALVERSIONS = (); 20aaebf433SRyan Anderson 21aaebf433SRyan Anderson# We are going to use the following commands to try and determine if this 22aaebf433SRyan Anderson# repository is at a Version boundary (i.e, 2.6.10 vs 2.6.10 + some patches) We 23aaebf433SRyan Anderson# currently assume that all meaningful version boundaries are marked by a tag. 24aaebf433SRyan Anderson# We don't care what the tag is, just that something exists. 25aaebf433SRyan Anderson 26aaebf433SRyan Anderson# Git/Cogito store the top-of-tree "commit" in .git/HEAD 27aaebf433SRyan Anderson# A list of known tags sits in .git/refs/tags/ 28aaebf433SRyan Anderson# 29aaebf433SRyan Anderson# The simple trick here is to just compare the two of these, and if we get a 30aaebf433SRyan Anderson# match, return nothing, otherwise, return a subset of the SHA-1 hash in 31aaebf433SRyan Anderson# .git/HEAD 32aaebf433SRyan Anderson 33aaebf433SRyan Andersonsub do_git_checks { 34aaebf433SRyan Anderson open(H,"<.git/HEAD") or return; 35aaebf433SRyan Anderson my $head = <H>; 36aaebf433SRyan Anderson chomp $head; 37aaebf433SRyan Anderson close(H); 38aaebf433SRyan Anderson 39aaebf433SRyan Anderson opendir(D,".git/refs/tags") or return; 40aaebf433SRyan Anderson foreach my $tagfile (grep !/^\.{1,2}$/, readdir(D)) { 41aaebf433SRyan Anderson open(F,"<.git/refs/tags/" . $tagfile) or return; 42aaebf433SRyan Anderson my $tag = <F>; 43aaebf433SRyan Anderson chomp $tag; 44aaebf433SRyan Anderson close(F); 45aaebf433SRyan Anderson return if ($tag eq $head); 46aaebf433SRyan Anderson } 47aaebf433SRyan Anderson closedir(D); 48aaebf433SRyan Anderson 49aaebf433SRyan Anderson push @LOCALVERSIONS, "g" . substr($head,0,8); 50aaebf433SRyan Anderson} 51aaebf433SRyan Anderson 52aaebf433SRyan Andersonif ( -d ".git") { 53aaebf433SRyan Anderson do_git_checks(); 54aaebf433SRyan Anderson} 55aaebf433SRyan Anderson 56aaebf433SRyan Andersonprintf "-%s\n", join("-",@LOCALVERSIONS) if (scalar @LOCALVERSIONS > 0); 57