The Perl Toolchain Summit 2025 Needs You: You can help 🙏 Learn more

#!/usr/bin/perl
use strict;
# Copyright 2012 Grant Street Group, All Rights Reserved.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# PODNAME: gitc
# ABSTRACT: The root delegator of all other gitc commands
our $VERSION = '0.60'; # VERSION
# generally /var/tmp has more space than /tmp It's possible that /tmp
# will get full. If '/var/tmp' doesn't exist on a particular machine,
# tmpdir() does the right thing and just defaults to /tmp. Of course, don't
# override if the user has already set TMPDIR to something he prefers
BEGIN { $ENV{TMPDIR} ||= '/var/tmp' };
# is it a built in command?
my $command = shift;
if ( not defined $command ) {
die "Usage: gitc command\n";
}
# a bit hackish, but certain commands are quite useful to be able to run
# while a promotion is in progress
my $check_suspended = 1;
if ($command =~ /^(show|log)$/) {
# however, don't let them run if they're going to update anything
my $params = join(':', @ARGV);
$check_suspended = 0
unless $params and $params =~ /(^|:)-{1,2}f/i; # --fetch
}
# make sure no gitc commands are suspended
my $suspend_file = '.git/gitc-suspended-process';
if ( $check_suspended and -e $suspend_file ) {
open my $fh, '<', $suspend_file
or die "Unable to open $suspend_file: $!\n";
chomp( my $pid = <$fh> );
chomp( my $msg = <$fh> );
close $fh;
die "$msg\nThe suspended PID is $pid. `jobs -l` might help.\n"
. "You can force your way through by deleting $suspend_file.\n"
;
}
# if this option is enabled then in the event a gitc command doesn't exist we will
# suggest the 'git' version of that command (if it exists)
my $should_suggest = `git config --get gitc.suggest-git-on-unknown-command | tr -d '\\n'` || 0;
if ($should_suggest) {
my $gitc_command_exists = `which gitc-$command 2>&1` !~ /no gitc-$command/;
my $git_command_exists = `git help -a|egrep '^ [a-zA-Z0-9]' | grep $command`;
if ($gitc_command_exists)
{
exec "gitc-$command", @ARGV;
}
elsif ($git_command_exists)
{
# the git version of $command exists. ask the user if they want to run it.
my $input;
print "Can't exec 'gitc-$command'. Did you mean git $command? [y/n] ";
$input = <STDIN>;
chomp $input;
if ($input =~ /^(y)(es)?$/i) {
my $cmd = "git $command " . join ' ', @ARGV;
print "> $cmd\n";
exec $cmd;
}
}
else
{
print "Can't exec 'gitc-$command' or 'git $command'.\n";
}
}
else
{
# suggest-git-on-failed-commend is not enabled
exec "gitc-$command", @ARGV;
}
__END__
=pod
=head1 NAME
gitc - The root delegator of all other gitc commands
=head1 VERSION
version 0.60
=head1 AUTHOR
Grant Street Group <developers@grantstreet.com>
=head1 COPYRIGHT AND LICENSE
This software is Copyright (c) 2013 by Grant Street Group.
This is free software, licensed under:
The GNU Affero General Public License, Version 3, November 2007
=cut