Reputation: 153
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:
Many thanks!
Upvotes: 13
Views: 17485
Reputation: 38418
This worked for me:
from git import Repo, InvalidGitRepositoryError
def get_repo(path):
try:
Repo(path)
return True
except InvalidGitRepositoryError:
return False
Upvotes: 0
Reputation: 77337
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 to complete 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!")
Upvotes: 9
Reputation: 11
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
Upvotes: 1
Reputation: 1223
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
Upvotes: 1
Reputation: 531
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
Upvotes: 28
Reputation: 11293
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
Upvotes: 9
Reputation: 3576
Wouldn't it be easier to just have python check and see if a folder named .git is present in the current running directory?
Upvotes: 4