Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python script to determine if a directory is a git repository

I have just started with Python and my first assignment is to write a script to determine if a directory where it is ran is a git repository. A co-student suggested this code:

#! /usr/bin/env python

from subprocess import Popen, PIPE, STDOUT
if Popen(("git", "branch"), stderr=STDOUT, stdout=PIPE).returncode != 0:
    print("Nope!")
else:
    print("Yup!")

It should print an output depending on what the returncode of console command "git branch" is. However, the script did not work in the repository.

In any case, I would be grateful for any piece of advice regarding this.

The assignment also includes:

  • being able to use same script on Windows
  • eventual passing of the path to determine to the script without having to copy it to the target directory

Many thanks!

like image 715
NickyKatze Avatar asked Oct 30 '13 15:10

NickyKatze


People also ask

How do I know if a directory is git repository?

So how can you tell if a directory is within a git repository? Exit code of 0 means it's a git repository. Any other code (e.g., 128 ) means it's not.

Is directory a git repo?

git directory was added to the git_basics directory. Conceptually, you can think about it as turning that directory into a git repository. After you initialize a directory as a git repository, you can start issuing other git commands.

What makes a directory a git repository?

To initialize a repository, Git creates a hidden directory called . git . That directory stores all of the objects and refs that Git uses and creates as a part of your project's history.


6 Answers

Install gitpython, e.g pip install gitpython.

Then make a function like this:

import git

...

def is_git_repo(path):
    try:
        _ = git.Repo(path).git_dir
        return True
    except git.exc.InvalidGitRepositoryError:
        return False
like image 89
Pablo Avatar answered Nov 16 '22 01:11

Pablo


Close! Popen is a more complicated object that starts a process but requires other interaction to get information. In your case, you need to call wait() so that the Popen object waits for the program completes to get the return code. You also risk the program hanging if the command returns too much information to fit in the pipe. Try 'call' (it calls wait for you) and send the command output to the bit bucket.

#! /usr/bin/env python

from subprocess import call, STDOUT
import os
if call(["git", "branch"], stderr=STDOUT, stdout=open(os.devnull, 'w')) != 0:
    print("Nope!")
else:
    print("Yup!")
like image 34
tdelaney Avatar answered Nov 16 '22 00:11

tdelaney


While tdelaney's answer is correct, I would like to post a function which is more generalised and can be quickly copy-pasted into someone's script:

There are two requirements for the function:

import os
import subprocess

And the function is quite simple:

def is_git_directory(path = '.'):
    return subprocess.call(['git', '-C', path, 'status'], stderr=subprocess.STDOUT, stdout = open(os.devnull, 'w')) == 0
like image 44
Pijusn Avatar answered Nov 16 '22 00:11

Pijusn


Wouldn't it be easier to just have python check and see if a folder named .git is present in the current running directory?

like image 29
Serban Constantin Avatar answered Nov 16 '22 02:11

Serban Constantin


The folder in question might also be within a git repo. For that reason I like to extract the root folder as well:

def getGitRoot(p):
    """Return None if p is not in a git repo, or the root of the repo if it is"""
    if call(["git", "branch"], stderr=STDOUT, stdout=open(os.devnull, 'w'), cwd=p) != 0:
        return None
    else:
        root = check_output(["git", "rev-parse", "--show-toplevel"], cwd=p)
        return root
like image 31
Jon Avatar answered Nov 16 '22 02:11

Jon


You could install GitPython and then you can apply this code

import git

def is_git_repo(path):
    try:
        _ = git.Repo(path).git_dir
        return True
    except git.exc.InvalidGitRepositoryError:
        return False
like image 23
Dude Unperfect Avatar answered Nov 16 '22 00:11

Dude Unperfect