Permalink
Browse files

first work on Fork origin display; works for local forks

  • Loading branch information...
cweiske committed Nov 21, 2012
1 parent d63a7b1 commit ba158e3ed03dec10e6654b0b0dd3710504bdf04d
@@ -0,0 +1,14 @@
+{% set conns = repo.getConnectionInfo() %}
+{% if conns.isFork() %}
+ {% set origin = conns.getOrigin() %}
+ <h4>Fork of</h4>
+ <p>
+ {% set webpage = origin.getWebURL() %}
+ {% if webpage %}
+ <a href="{{webpage}}">{{origin.getTitle()}}</a>
+ {% else %}
+ {{origin.getTitle()}}
+ {% endif %}
+ (<a href="{{origin.getCloneUrl()}}">clone URL</a>)
+ </p>
+{% endif %}
@@ -23,5 +23,6 @@
{% block sidebar %}
{% include 'display-sidebar-owner.htm' %}
+ {% include 'display-sidebar-fork.htm' %}
{% include 'display-sidebar-history.htm' %}
{% endblock %}
@@ -359,6 +359,14 @@ public function getHistory()
return $arCommits;
}
+
+ /**
+ * @return Repository_ConnectionInfo
+ */
+ public function getConnectionInfo()
+ {
+ return new Repository_ConnectionInfo($this);
+ }
}
?>
@@ -0,0 +1,42 @@
+<?php
+namespace phorkie;
+
+class Repository_ConnectionInfo
+{
+ protected $arConfig;
+ protected $repo;
+
+
+ public function __construct(Repository $repo)
+ {
+ $this->repo = $repo;
+ $this->arConfig = parse_ini_file($this->repo->gitDir . '/config', true);
+ }
+
+ public function isFork()
+ {
+ return $this->getOrigin() !== null;
+ }
+
+
+ public function getOrigin()
+ {
+ return $this->getRemote('origin');
+ }
+
+ /**
+ * @return Repository_Remote|null NULL if the remote does not exist, array
+ * with repository information otherwise
+ */
+ public function getRemote($name)
+ {
+ if (!isset($this->arConfig['remote ' . $name])) {
+ return null;
+ }
+ return new Repository_Remote($name, $this->arConfig['remote ' . $name]);
+ }
+
+}
+
+
+?>
@@ -0,0 +1,94 @@
+<?php
+namespace phorkie;
+
+class Repository_Remote
+{
+ protected $arConfig;
+ protected $name;
+
+ public function __construct($name, $arConfig)
+ {
+ $this->name = $name;
+ $this->arConfig = $arConfig;
+ }
+
+
+ public function getTitle()
+ {
+ if (isset($this->arConfig['title'])) {
+ return $this->arConfig['title'];
+ }
+ if ($this->isLocal()) {
+ $local = $this->getLocalRepository();
+ if ($local !== null) {
+ return $local->getTitle();
+ }
+ return 'deleted local paste';
+ }
+
+ return 'untitled repository';
+ }
+
+ public function getCloneURL()
+ {
+ if ($this->isLocal()) {
+ $local = $this->getLocalRepository();
+ if ($local !== null) {
+ return $local->getCloneURL();
+ }
+ }
+
+ return $this->arConfig['url'];
+ }
+
+ public function getWebURL()
+ {
+ if (isset($this->arConfig['homepage'])) {
+ return $this->arConfig['homepage'];
+ }
+
+ if ($this->isLocal()) {
+ $local = $this->getLocalRepository();
+ if ($local !== null) {
+ return $local->getLink('display');
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Tells you if this remote repository is a paste on the local server
+ *
+ * @return boolean True of false
+ */
+ public function isLocal()
+ {
+ return isset($this->arConfig['url'])
+ && $this->arConfig['url']{0} == '/';
+ }
+
+ /**
+ * If this remote is a local paste, then we'll get the repository object
+ * returned
+ *
+ * @return Repository Repository object or NULL
+ */
+ public function getLocalRepository()
+ {
+ if (!file_exists($this->arConfig['url'] . '/config')) {
+ return null;
+ }
+ $dir = basename($this->arConfig['url']);
+ if (substr($dir, -4) != '.git') {
+ //phorks are bare repositories "123.git"
+ return null;
+ }
+ $repo = new Repository();
+ $repo->loadById(substr($dir, 0, -4));
+ return $repo;
+ }
+
+}
+
+?>

0 comments on commit ba158e3

Please sign in to comment.