mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-06 13:35:50 +01:00
Merge branch 'master' into fork-and-pullreq
Conflicts: src/main/scala/app/RepositoryViewerController.scala src/main/scala/service/RepositoryService.scala
This commit is contained in:
10
README.md
10
README.md
@@ -36,6 +36,16 @@ To upgrade GitBucket, only replace gitbucket.war.
|
|||||||
|
|
||||||
Release Notes
|
Release Notes
|
||||||
--------
|
--------
|
||||||
|
### 1.4 - 31 Jul 2013
|
||||||
|
- Group management.
|
||||||
|
- Repository search for code and issues.
|
||||||
|
- Display user related issues on the dashboard.
|
||||||
|
- Display participants avatar of issues on the issue page.
|
||||||
|
- Performance improvement for repository viewer.
|
||||||
|
- Alert by milestone due date.
|
||||||
|
- H2 database administration console.
|
||||||
|
- Fixed some bugs.
|
||||||
|
|
||||||
### 1.3 - 18 Jul 2013
|
### 1.3 - 18 Jul 2013
|
||||||
- Batch updating for issues.
|
- Batch updating for issues.
|
||||||
- Display assigned user on issue list.
|
- Display assigned user on issue list.
|
||||||
|
|||||||
613
gitbucket.erd
613
gitbucket.erd
@@ -23,8 +23,8 @@
|
|||||||
<constraint>
|
<constraint>
|
||||||
<height>-1</height>
|
<height>-1</height>
|
||||||
<width>-1</width>
|
<width>-1</width>
|
||||||
<x>37</x>
|
<x>33</x>
|
||||||
<y>36</y>
|
<y>18</y>
|
||||||
</constraint>
|
</constraint>
|
||||||
<sourceConnections/>
|
<sourceConnections/>
|
||||||
<targetConnections>
|
<targetConnections>
|
||||||
@@ -51,8 +51,8 @@
|
|||||||
<constraint>
|
<constraint>
|
||||||
<height>-1</height>
|
<height>-1</height>
|
||||||
<width>-1</width>
|
<width>-1</width>
|
||||||
<x>751</x>
|
<x>723</x>
|
||||||
<y>47</y>
|
<y>138</y>
|
||||||
</constraint>
|
</constraint>
|
||||||
<sourceConnections>
|
<sourceConnections>
|
||||||
<net.java.amateras.db.visual.model.ForeignKeyModel>
|
<net.java.amateras.db.visual.model.ForeignKeyModel>
|
||||||
@@ -79,8 +79,8 @@
|
|||||||
<constraint>
|
<constraint>
|
||||||
<height>-1</height>
|
<height>-1</height>
|
||||||
<width>-1</width>
|
<width>-1</width>
|
||||||
<x>882</x>
|
<x>1182</x>
|
||||||
<y>239</y>
|
<y>339</y>
|
||||||
</constraint>
|
</constraint>
|
||||||
<sourceConnections/>
|
<sourceConnections/>
|
||||||
<targetConnections>
|
<targetConnections>
|
||||||
@@ -108,8 +108,8 @@
|
|||||||
<constraint>
|
<constraint>
|
||||||
<height>-1</height>
|
<height>-1</height>
|
||||||
<width>-1</width>
|
<width>-1</width>
|
||||||
<x>940</x>
|
<x>1301</x>
|
||||||
<y>615</y>
|
<y>836</y>
|
||||||
</constraint>
|
</constraint>
|
||||||
<sourceConnections>
|
<sourceConnections>
|
||||||
<net.java.amateras.db.visual.model.ForeignKeyModel reference="../../.."/>
|
<net.java.amateras.db.visual.model.ForeignKeyModel reference="../../.."/>
|
||||||
@@ -138,8 +138,8 @@
|
|||||||
<constraint>
|
<constraint>
|
||||||
<height>-1</height>
|
<height>-1</height>
|
||||||
<width>-1</width>
|
<width>-1</width>
|
||||||
<x>420</x>
|
<x>684</x>
|
||||||
<y>758</y>
|
<y>858</y>
|
||||||
</constraint>
|
</constraint>
|
||||||
<sourceConnections>
|
<sourceConnections>
|
||||||
<net.java.amateras.db.visual.model.ForeignKeyModel reference="../../.."/>
|
<net.java.amateras.db.visual.model.ForeignKeyModel reference="../../.."/>
|
||||||
@@ -167,8 +167,8 @@
|
|||||||
<constraint>
|
<constraint>
|
||||||
<height>-1</height>
|
<height>-1</height>
|
||||||
<width>-1</width>
|
<width>-1</width>
|
||||||
<x>307</x>
|
<x>293</x>
|
||||||
<y>356</y>
|
<y>478</y>
|
||||||
</constraint>
|
</constraint>
|
||||||
<sourceConnections>
|
<sourceConnections>
|
||||||
<net.java.amateras.db.visual.model.ForeignKeyModel>
|
<net.java.amateras.db.visual.model.ForeignKeyModel>
|
||||||
@@ -210,8 +210,8 @@
|
|||||||
<constraint>
|
<constraint>
|
||||||
<height>-1</height>
|
<height>-1</height>
|
||||||
<width>-1</width>
|
<width>-1</width>
|
||||||
<x>641</x>
|
<x>875</x>
|
||||||
<y>569</y>
|
<y>677</y>
|
||||||
</constraint>
|
</constraint>
|
||||||
<sourceConnections>
|
<sourceConnections>
|
||||||
<net.java.amateras.db.visual.model.ForeignKeyModel>
|
<net.java.amateras.db.visual.model.ForeignKeyModel>
|
||||||
@@ -283,9 +283,14 @@
|
|||||||
<defaultValue></defaultValue>
|
<defaultValue></defaultValue>
|
||||||
</net.java.amateras.db.visual.model.ColumnModel>
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
<net.java.amateras.db.visual.model.ColumnModel>
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
<columnName>MILESTONE_NAME</columnName>
|
<columnName>TITLE</columnName>
|
||||||
<logicalName>Milestone Name</logicalName>
|
<logicalName>Title</logicalName>
|
||||||
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../net.java.amateras.db.visual.model.ColumnModel/columnType"/>
|
<columnType class="net.java.amateras.db.dialect.ColumnType">
|
||||||
|
<name>VARCHAR</name>
|
||||||
|
<logicalName>文字列</logicalName>
|
||||||
|
<supportSize>true</supportSize>
|
||||||
|
<type>12</type>
|
||||||
|
</columnType>
|
||||||
<size>100</size>
|
<size>100</size>
|
||||||
<notNull>true</notNull>
|
<notNull>true</notNull>
|
||||||
<primaryKey>false</primaryKey>
|
<primaryKey>false</primaryKey>
|
||||||
@@ -293,6 +298,49 @@
|
|||||||
<autoIncrement>false</autoIncrement>
|
<autoIncrement>false</autoIncrement>
|
||||||
<defaultValue></defaultValue>
|
<defaultValue></defaultValue>
|
||||||
</net.java.amateras.db.visual.model.ColumnModel>
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<columnName>DESCRIPTION</columnName>
|
||||||
|
<logicalName>Description</logicalName>
|
||||||
|
<columnType class="net.java.amateras.db.dialect.ColumnType">
|
||||||
|
<name>TEXT</name>
|
||||||
|
<logicalName>文字列</logicalName>
|
||||||
|
<supportSize>true</supportSize>
|
||||||
|
<type>2005</type>
|
||||||
|
</columnType>
|
||||||
|
<size></size>
|
||||||
|
<notNull>false</notNull>
|
||||||
|
<primaryKey>false</primaryKey>
|
||||||
|
<description></description>
|
||||||
|
<autoIncrement>false</autoIncrement>
|
||||||
|
<defaultValue></defaultValue>
|
||||||
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<columnName>DUE_DATE</columnName>
|
||||||
|
<logicalName>Due Date</logicalName>
|
||||||
|
<columnType class="net.java.amateras.db.dialect.ColumnType">
|
||||||
|
<name>TIMESTAMP</name>
|
||||||
|
<logicalName>日時</logicalName>
|
||||||
|
<supportSize>false</supportSize>
|
||||||
|
<type>93</type>
|
||||||
|
</columnType>
|
||||||
|
<size>10</size>
|
||||||
|
<notNull>false</notNull>
|
||||||
|
<primaryKey>false</primaryKey>
|
||||||
|
<description></description>
|
||||||
|
<autoIncrement>false</autoIncrement>
|
||||||
|
<defaultValue></defaultValue>
|
||||||
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<columnName>CLOSED_DATE</columnName>
|
||||||
|
<logicalName>Closed Date</logicalName>
|
||||||
|
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../net.java.amateras.db.visual.model.ColumnModel[6]/columnType"/>
|
||||||
|
<size>10</size>
|
||||||
|
<notNull>false</notNull>
|
||||||
|
<primaryKey>false</primaryKey>
|
||||||
|
<description></description>
|
||||||
|
<autoIncrement>false</autoIncrement>
|
||||||
|
<defaultValue></defaultValue>
|
||||||
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
</columns>
|
</columns>
|
||||||
<indices/>
|
<indices/>
|
||||||
<backgroundColor>
|
<backgroundColor>
|
||||||
@@ -350,6 +398,36 @@
|
|||||||
</entry>
|
</entry>
|
||||||
</references>
|
</references>
|
||||||
</net.java.amateras.db.visual.model.ForeignKeyModel>
|
</net.java.amateras.db.visual.model.ForeignKeyModel>
|
||||||
|
<net.java.amateras.db.visual.model.ForeignKeyModel>
|
||||||
|
<listeners serialization="custom">
|
||||||
|
<java.beans.PropertyChangeSupport>
|
||||||
|
<default>
|
||||||
|
<source class="net.java.amateras.db.visual.model.ForeignKeyModel" reference="../../../.."/>
|
||||||
|
<propertyChangeSupportSerializedDataVersion>2</propertyChangeSupportSerializedDataVersion>
|
||||||
|
</default>
|
||||||
|
<null/>
|
||||||
|
</java.beans.PropertyChangeSupport>
|
||||||
|
</listeners>
|
||||||
|
<source class="net.java.amateras.db.visual.model.TableModel" reference="../../.."/>
|
||||||
|
<target class="net.java.amateras.db.visual.model.TableModel" reference="../../../../../../../../../../../../../../../../../.."/>
|
||||||
|
<foreignKeyName>ISSUE_FK_2</foreignKeyName>
|
||||||
|
<references>
|
||||||
|
<entry>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel reference="../../../../net.java.amateras.db.visual.model.ForeignKeyModel[3]/references/entry/net.java.amateras.db.visual.model.ColumnModel"/>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<columnName>ASSIGNED_USER_NAME</columnName>
|
||||||
|
<logicalName>Assinged User Name</logicalName>
|
||||||
|
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../../../../net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/columns/net.java.amateras.db.visual.model.ColumnModel[4]/columnType"/>
|
||||||
|
<size>100</size>
|
||||||
|
<notNull>false</notNull>
|
||||||
|
<primaryKey>false</primaryKey>
|
||||||
|
<description></description>
|
||||||
|
<autoIncrement>false</autoIncrement>
|
||||||
|
<defaultValue></defaultValue>
|
||||||
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
</entry>
|
||||||
|
</references>
|
||||||
|
</net.java.amateras.db.visual.model.ForeignKeyModel>
|
||||||
</sourceConnections>
|
</sourceConnections>
|
||||||
<targetConnections>
|
<targetConnections>
|
||||||
<net.java.amateras.db.visual.model.ForeignKeyModel>
|
<net.java.amateras.db.visual.model.ForeignKeyModel>
|
||||||
@@ -375,8 +453,8 @@
|
|||||||
<constraint>
|
<constraint>
|
||||||
<height>-1</height>
|
<height>-1</height>
|
||||||
<width>-1</width>
|
<width>-1</width>
|
||||||
<x>26</x>
|
<x>18</x>
|
||||||
<y>660</y>
|
<y>776</y>
|
||||||
</constraint>
|
</constraint>
|
||||||
<sourceConnections>
|
<sourceConnections>
|
||||||
<net.java.amateras.db.visual.model.ForeignKeyModel reference="../../.."/>
|
<net.java.amateras.db.visual.model.ForeignKeyModel reference="../../.."/>
|
||||||
@@ -462,6 +540,22 @@
|
|||||||
<autoIncrement>true</autoIncrement>
|
<autoIncrement>true</autoIncrement>
|
||||||
<defaultValue></defaultValue>
|
<defaultValue></defaultValue>
|
||||||
</net.java.amateras.db.visual.model.ColumnModel>
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<columnName>ACTION</columnName>
|
||||||
|
<logicalName>Action</logicalName>
|
||||||
|
<columnType class="net.java.amateras.db.dialect.ColumnType">
|
||||||
|
<name>VARCHAR</name>
|
||||||
|
<logicalName>文字列</logicalName>
|
||||||
|
<supportSize>true</supportSize>
|
||||||
|
<type>12</type>
|
||||||
|
</columnType>
|
||||||
|
<size>20</size>
|
||||||
|
<notNull>true</notNull>
|
||||||
|
<primaryKey>false</primaryKey>
|
||||||
|
<description>Expand to VARCHAR(20) from VARCHAR(10) in 1.3</description>
|
||||||
|
<autoIncrement>false</autoIncrement>
|
||||||
|
<defaultValue></defaultValue>
|
||||||
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
<net.java.amateras.db.visual.model.ColumnModel reference="../../sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/references/entry/net.java.amateras.db.visual.model.ColumnModel[2]"/>
|
<net.java.amateras.db.visual.model.ColumnModel reference="../../sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/references/entry/net.java.amateras.db.visual.model.ColumnModel[2]"/>
|
||||||
<net.java.amateras.db.visual.model.ColumnModel>
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
<columnName>CONTENT</columnName>
|
<columnName>CONTENT</columnName>
|
||||||
@@ -498,7 +592,7 @@
|
|||||||
<net.java.amateras.db.visual.model.ColumnModel>
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
<columnName>UPDATED_DATE</columnName>
|
<columnName>UPDATED_DATE</columnName>
|
||||||
<logicalName>Updated Date</logicalName>
|
<logicalName>Updated Date</logicalName>
|
||||||
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../net.java.amateras.db.visual.model.ColumnModel[7]/columnType"/>
|
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../net.java.amateras.db.visual.model.ColumnModel[8]/columnType"/>
|
||||||
<size>10</size>
|
<size>10</size>
|
||||||
<notNull>true</notNull>
|
<notNull>true</notNull>
|
||||||
<primaryKey>false</primaryKey>
|
<primaryKey>false</primaryKey>
|
||||||
@@ -572,10 +666,11 @@
|
|||||||
<autoIncrement>false</autoIncrement>
|
<autoIncrement>false</autoIncrement>
|
||||||
<defaultValue></defaultValue>
|
<defaultValue></defaultValue>
|
||||||
</net.java.amateras.db.visual.model.ColumnModel>
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel reference="../../sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[4]/references/entry/net.java.amateras.db.visual.model.ColumnModel[2]"/>
|
||||||
<net.java.amateras.db.visual.model.ColumnModel>
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
<columnName>TITLE</columnName>
|
<columnName>TITLE</columnName>
|
||||||
<logicalName>Title</logicalName>
|
<logicalName>Title</logicalName>
|
||||||
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../../targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/columns/net.java.amateras.db.visual.model.ColumnModel[6]/columnType"/>
|
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../../targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/columns/net.java.amateras.db.visual.model.ColumnModel[7]/columnType"/>
|
||||||
<size></size>
|
<size></size>
|
||||||
<notNull>true</notNull>
|
<notNull>true</notNull>
|
||||||
<primaryKey>false</primaryKey>
|
<primaryKey>false</primaryKey>
|
||||||
@@ -586,7 +681,7 @@
|
|||||||
<net.java.amateras.db.visual.model.ColumnModel>
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
<columnName>CONTENT</columnName>
|
<columnName>CONTENT</columnName>
|
||||||
<logicalName>Content</logicalName>
|
<logicalName>Content</logicalName>
|
||||||
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../../targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/columns/net.java.amateras.db.visual.model.ColumnModel[6]/columnType"/>
|
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../../targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/columns/net.java.amateras.db.visual.model.ColumnModel[7]/columnType"/>
|
||||||
<size></size>
|
<size></size>
|
||||||
<notNull>true</notNull>
|
<notNull>true</notNull>
|
||||||
<primaryKey>false</primaryKey>
|
<primaryKey>false</primaryKey>
|
||||||
@@ -597,7 +692,7 @@
|
|||||||
<net.java.amateras.db.visual.model.ColumnModel>
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
<columnName>REGISTERED_DATE</columnName>
|
<columnName>REGISTERED_DATE</columnName>
|
||||||
<logicalName>Registered Date</logicalName>
|
<logicalName>Registered Date</logicalName>
|
||||||
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../../targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/columns/net.java.amateras.db.visual.model.ColumnModel[7]/columnType"/>
|
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../../targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/columns/net.java.amateras.db.visual.model.ColumnModel[8]/columnType"/>
|
||||||
<size>10</size>
|
<size>10</size>
|
||||||
<notNull>true</notNull>
|
<notNull>true</notNull>
|
||||||
<primaryKey>false</primaryKey>
|
<primaryKey>false</primaryKey>
|
||||||
@@ -608,7 +703,7 @@
|
|||||||
<net.java.amateras.db.visual.model.ColumnModel>
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
<columnName>UPDATED_DATE</columnName>
|
<columnName>UPDATED_DATE</columnName>
|
||||||
<logicalName>Updated Date</logicalName>
|
<logicalName>Updated Date</logicalName>
|
||||||
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../../targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/columns/net.java.amateras.db.visual.model.ColumnModel[7]/columnType"/>
|
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../../targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/columns/net.java.amateras.db.visual.model.ColumnModel[8]/columnType"/>
|
||||||
<size>10</size>
|
<size>10</size>
|
||||||
<notNull>true</notNull>
|
<notNull>true</notNull>
|
||||||
<primaryKey>false</primaryKey>
|
<primaryKey>false</primaryKey>
|
||||||
@@ -801,8 +896,8 @@
|
|||||||
<constraint>
|
<constraint>
|
||||||
<height>-1</height>
|
<height>-1</height>
|
||||||
<width>-1</width>
|
<width>-1</width>
|
||||||
<x>388</x>
|
<x>481</x>
|
||||||
<y>166</y>
|
<y>361</y>
|
||||||
</constraint>
|
</constraint>
|
||||||
<sourceConnections>
|
<sourceConnections>
|
||||||
<net.java.amateras.db.visual.model.ForeignKeyModel reference="../../.."/>
|
<net.java.amateras.db.visual.model.ForeignKeyModel reference="../../.."/>
|
||||||
@@ -862,6 +957,250 @@
|
|||||||
</net.java.amateras.db.visual.model.ForeignKeyModel>
|
</net.java.amateras.db.visual.model.ForeignKeyModel>
|
||||||
<net.java.amateras.db.visual.model.ForeignKeyModel reference="../net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel"/>
|
<net.java.amateras.db.visual.model.ForeignKeyModel reference="../net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel"/>
|
||||||
<net.java.amateras.db.visual.model.ForeignKeyModel reference="../net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel"/>
|
<net.java.amateras.db.visual.model.ForeignKeyModel reference="../net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel"/>
|
||||||
|
<net.java.amateras.db.visual.model.ForeignKeyModel>
|
||||||
|
<listeners serialization="custom">
|
||||||
|
<java.beans.PropertyChangeSupport>
|
||||||
|
<default>
|
||||||
|
<source class="net.java.amateras.db.visual.model.ForeignKeyModel" reference="../../../.."/>
|
||||||
|
<propertyChangeSupportSerializedDataVersion>2</propertyChangeSupportSerializedDataVersion>
|
||||||
|
</default>
|
||||||
|
<null/>
|
||||||
|
</java.beans.PropertyChangeSupport>
|
||||||
|
</listeners>
|
||||||
|
<source class="net.java.amateras.db.visual.model.TableModel">
|
||||||
|
<listeners serialization="custom">
|
||||||
|
<java.beans.PropertyChangeSupport>
|
||||||
|
<default>
|
||||||
|
<source class="net.java.amateras.db.visual.model.TableModel" reference="../../../.."/>
|
||||||
|
<propertyChangeSupportSerializedDataVersion>2</propertyChangeSupportSerializedDataVersion>
|
||||||
|
</default>
|
||||||
|
<null/>
|
||||||
|
</java.beans.PropertyChangeSupport>
|
||||||
|
</listeners>
|
||||||
|
<constraint>
|
||||||
|
<height>-1</height>
|
||||||
|
<width>-1</width>
|
||||||
|
<x>1199</x>
|
||||||
|
<y>25</y>
|
||||||
|
</constraint>
|
||||||
|
<sourceConnections>
|
||||||
|
<net.java.amateras.db.visual.model.ForeignKeyModel reference="../../.."/>
|
||||||
|
<net.java.amateras.db.visual.model.ForeignKeyModel>
|
||||||
|
<listeners serialization="custom">
|
||||||
|
<java.beans.PropertyChangeSupport>
|
||||||
|
<default>
|
||||||
|
<source class="net.java.amateras.db.visual.model.ForeignKeyModel" reference="../../../.."/>
|
||||||
|
<propertyChangeSupportSerializedDataVersion>2</propertyChangeSupportSerializedDataVersion>
|
||||||
|
</default>
|
||||||
|
<null/>
|
||||||
|
</java.beans.PropertyChangeSupport>
|
||||||
|
</listeners>
|
||||||
|
<source class="net.java.amateras.db.visual.model.TableModel" reference="../../.."/>
|
||||||
|
<target class="net.java.amateras.db.visual.model.TableModel" reference="../../../../../../../../../../../.."/>
|
||||||
|
<foreignKeyName>ACTIVITY_FK_2</foreignKeyName>
|
||||||
|
<references>
|
||||||
|
<entry>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel reference="../../../../../../../net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[3]/references/entry/net.java.amateras.db.visual.model.ColumnModel"/>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<columnName>ACTIVITY_USER_NAME</columnName>
|
||||||
|
<logicalName>Activity User Name</logicalName>
|
||||||
|
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../../../../../../../net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/columns/net.java.amateras.db.visual.model.ColumnModel[4]/columnType"/>
|
||||||
|
<size>100</size>
|
||||||
|
<notNull>true</notNull>
|
||||||
|
<primaryKey>false</primaryKey>
|
||||||
|
<description></description>
|
||||||
|
<autoIncrement>false</autoIncrement>
|
||||||
|
<defaultValue></defaultValue>
|
||||||
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
</entry>
|
||||||
|
</references>
|
||||||
|
</net.java.amateras.db.visual.model.ForeignKeyModel>
|
||||||
|
</sourceConnections>
|
||||||
|
<targetConnections/>
|
||||||
|
<error></error>
|
||||||
|
<linkedPath></linkedPath>
|
||||||
|
<tableName>ACTIVITY</tableName>
|
||||||
|
<logicalName>Activity</logicalName>
|
||||||
|
<description>Since 1.2</description>
|
||||||
|
<columns>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<columnName>ACTIVITY_ID</columnName>
|
||||||
|
<logicalName>Activity ID</logicalName>
|
||||||
|
<columnType class="net.java.amateras.db.dialect.ColumnType">
|
||||||
|
<name>INT</name>
|
||||||
|
<logicalName>整数</logicalName>
|
||||||
|
<supportSize>false</supportSize>
|
||||||
|
<type>4</type>
|
||||||
|
</columnType>
|
||||||
|
<size>10</size>
|
||||||
|
<notNull>true</notNull>
|
||||||
|
<primaryKey>true</primaryKey>
|
||||||
|
<description></description>
|
||||||
|
<autoIncrement>true</autoIncrement>
|
||||||
|
<defaultValue></defaultValue>
|
||||||
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<columnName>USER_NAME</columnName>
|
||||||
|
<logicalName>User Name</logicalName>
|
||||||
|
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../../../../net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/columns/net.java.amateras.db.visual.model.ColumnModel[4]/columnType"/>
|
||||||
|
<size>100</size>
|
||||||
|
<notNull>true</notNull>
|
||||||
|
<primaryKey>false</primaryKey>
|
||||||
|
<description></description>
|
||||||
|
<autoIncrement>false</autoIncrement>
|
||||||
|
<defaultValue></defaultValue>
|
||||||
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<columnName>REPOSITORY_NAME</columnName>
|
||||||
|
<logicalName>Repository Name</logicalName>
|
||||||
|
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../../../../net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/columns/net.java.amateras.db.visual.model.ColumnModel[4]/columnType"/>
|
||||||
|
<size>100</size>
|
||||||
|
<notNull>true</notNull>
|
||||||
|
<primaryKey>false</primaryKey>
|
||||||
|
<description></description>
|
||||||
|
<autoIncrement>false</autoIncrement>
|
||||||
|
<defaultValue></defaultValue>
|
||||||
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel reference="../../sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/references/entry/net.java.amateras.db.visual.model.ColumnModel[2]"/>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<columnName>ACTIVITY_TYPE</columnName>
|
||||||
|
<logicalName>Activity Type</logicalName>
|
||||||
|
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../../../../net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/columns/net.java.amateras.db.visual.model.ColumnModel[4]/columnType"/>
|
||||||
|
<size>100</size>
|
||||||
|
<notNull>true</notNull>
|
||||||
|
<primaryKey>false</primaryKey>
|
||||||
|
<description></description>
|
||||||
|
<autoIncrement>false</autoIncrement>
|
||||||
|
<defaultValue></defaultValue>
|
||||||
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<columnName>MESSAGE</columnName>
|
||||||
|
<logicalName>Message</logicalName>
|
||||||
|
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../../../../net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/columns/net.java.amateras.db.visual.model.ColumnModel[5]/columnType"/>
|
||||||
|
<size></size>
|
||||||
|
<notNull>true</notNull>
|
||||||
|
<primaryKey>false</primaryKey>
|
||||||
|
<description></description>
|
||||||
|
<autoIncrement>false</autoIncrement>
|
||||||
|
<defaultValue></defaultValue>
|
||||||
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<columnName>ADDITIONAL_INFO</columnName>
|
||||||
|
<logicalName>Additional Information</logicalName>
|
||||||
|
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../../../../net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/columns/net.java.amateras.db.visual.model.ColumnModel[5]/columnType"/>
|
||||||
|
<size></size>
|
||||||
|
<notNull>false</notNull>
|
||||||
|
<primaryKey>false</primaryKey>
|
||||||
|
<description></description>
|
||||||
|
<autoIncrement>false</autoIncrement>
|
||||||
|
<defaultValue></defaultValue>
|
||||||
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<columnName>ACTIVITY_DATE</columnName>
|
||||||
|
<logicalName>Activity Date</logicalName>
|
||||||
|
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../../../../net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/columns/net.java.amateras.db.visual.model.ColumnModel[6]/columnType"/>
|
||||||
|
<size>10</size>
|
||||||
|
<notNull>true</notNull>
|
||||||
|
<primaryKey>false</primaryKey>
|
||||||
|
<description></description>
|
||||||
|
<autoIncrement>false</autoIncrement>
|
||||||
|
<defaultValue></defaultValue>
|
||||||
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
</columns>
|
||||||
|
<indices/>
|
||||||
|
<backgroundColor>
|
||||||
|
<red>255</red>
|
||||||
|
<green>255</green>
|
||||||
|
<blue>206</blue>
|
||||||
|
</backgroundColor>
|
||||||
|
<sql></sql>
|
||||||
|
</source>
|
||||||
|
<target class="net.java.amateras.db.visual.model.TableModel" reference="../../.."/>
|
||||||
|
<foreignKeyName>ACTIVITY_FK_1</foreignKeyName>
|
||||||
|
<references/>
|
||||||
|
</net.java.amateras.db.visual.model.ForeignKeyModel>
|
||||||
|
<net.java.amateras.db.visual.model.ForeignKeyModel>
|
||||||
|
<listeners serialization="custom">
|
||||||
|
<java.beans.PropertyChangeSupport>
|
||||||
|
<default>
|
||||||
|
<source class="net.java.amateras.db.visual.model.ForeignKeyModel" reference="../../../.."/>
|
||||||
|
<propertyChangeSupportSerializedDataVersion>2</propertyChangeSupportSerializedDataVersion>
|
||||||
|
</default>
|
||||||
|
<null/>
|
||||||
|
</java.beans.PropertyChangeSupport>
|
||||||
|
</listeners>
|
||||||
|
<source class="net.java.amateras.db.visual.model.TableModel">
|
||||||
|
<listeners serialization="custom">
|
||||||
|
<java.beans.PropertyChangeSupport>
|
||||||
|
<default>
|
||||||
|
<source class="net.java.amateras.db.visual.model.TableModel" reference="../../../.."/>
|
||||||
|
<propertyChangeSupportSerializedDataVersion>2</propertyChangeSupportSerializedDataVersion>
|
||||||
|
</default>
|
||||||
|
<null/>
|
||||||
|
</java.beans.PropertyChangeSupport>
|
||||||
|
</listeners>
|
||||||
|
<constraint>
|
||||||
|
<height>-1</height>
|
||||||
|
<width>-1</width>
|
||||||
|
<x>1451</x>
|
||||||
|
<y>577</y>
|
||||||
|
</constraint>
|
||||||
|
<sourceConnections>
|
||||||
|
<net.java.amateras.db.visual.model.ForeignKeyModel reference="../../.."/>
|
||||||
|
</sourceConnections>
|
||||||
|
<targetConnections/>
|
||||||
|
<error></error>
|
||||||
|
<linkedPath></linkedPath>
|
||||||
|
<tableName>COMMIT_LOG</tableName>
|
||||||
|
<logicalName>Commit Log</logicalName>
|
||||||
|
<description>Since 1.2</description>
|
||||||
|
<columns>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<columnName>USER_NAME</columnName>
|
||||||
|
<logicalName>User Name</logicalName>
|
||||||
|
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../../../../net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/columns/net.java.amateras.db.visual.model.ColumnModel[4]/columnType"/>
|
||||||
|
<size>100</size>
|
||||||
|
<notNull>true</notNull>
|
||||||
|
<primaryKey>true</primaryKey>
|
||||||
|
<description></description>
|
||||||
|
<autoIncrement>false</autoIncrement>
|
||||||
|
<defaultValue></defaultValue>
|
||||||
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<columnName>REPOSITORY_NAME</columnName>
|
||||||
|
<logicalName>Repository Name</logicalName>
|
||||||
|
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../../../../net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/columns/net.java.amateras.db.visual.model.ColumnModel[4]/columnType"/>
|
||||||
|
<size>100</size>
|
||||||
|
<notNull>true</notNull>
|
||||||
|
<primaryKey>true</primaryKey>
|
||||||
|
<description></description>
|
||||||
|
<autoIncrement>false</autoIncrement>
|
||||||
|
<defaultValue></defaultValue>
|
||||||
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<columnName>COMMIT_ID</columnName>
|
||||||
|
<logicalName>Commit ID</logicalName>
|
||||||
|
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../../../../net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/columns/net.java.amateras.db.visual.model.ColumnModel[4]/columnType"/>
|
||||||
|
<size>40</size>
|
||||||
|
<notNull>true</notNull>
|
||||||
|
<primaryKey>true</primaryKey>
|
||||||
|
<description></description>
|
||||||
|
<autoIncrement>false</autoIncrement>
|
||||||
|
<defaultValue></defaultValue>
|
||||||
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
</columns>
|
||||||
|
<indices/>
|
||||||
|
<backgroundColor>
|
||||||
|
<red>255</red>
|
||||||
|
<green>255</green>
|
||||||
|
<blue>206</blue>
|
||||||
|
</backgroundColor>
|
||||||
|
<sql></sql>
|
||||||
|
</source>
|
||||||
|
<target class="net.java.amateras.db.visual.model.TableModel" reference="../../.."/>
|
||||||
|
<foreignKeyName>COMMIT_LOG_FK_1</foreignKeyName>
|
||||||
|
<references/>
|
||||||
|
</net.java.amateras.db.visual.model.ForeignKeyModel>
|
||||||
</targetConnections>
|
</targetConnections>
|
||||||
<error></error>
|
<error></error>
|
||||||
<linkedPath></linkedPath>
|
<linkedPath></linkedPath>
|
||||||
@@ -1062,6 +1401,100 @@
|
|||||||
</net.java.amateras.db.visual.model.ForeignKeyModel>
|
</net.java.amateras.db.visual.model.ForeignKeyModel>
|
||||||
<net.java.amateras.db.visual.model.ForeignKeyModel reference="../net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[3]"/>
|
<net.java.amateras.db.visual.model.ForeignKeyModel reference="../net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[3]"/>
|
||||||
<net.java.amateras.db.visual.model.ForeignKeyModel reference="../net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]"/>
|
<net.java.amateras.db.visual.model.ForeignKeyModel reference="../net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]"/>
|
||||||
|
<net.java.amateras.db.visual.model.ForeignKeyModel reference="../net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel[6]/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]"/>
|
||||||
|
<net.java.amateras.db.visual.model.ForeignKeyModel reference="../net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[4]"/>
|
||||||
|
<net.java.amateras.db.visual.model.ForeignKeyModel>
|
||||||
|
<listeners serialization="custom">
|
||||||
|
<java.beans.PropertyChangeSupport>
|
||||||
|
<default>
|
||||||
|
<source class="net.java.amateras.db.visual.model.ForeignKeyModel" reference="../../../.."/>
|
||||||
|
<propertyChangeSupportSerializedDataVersion>2</propertyChangeSupportSerializedDataVersion>
|
||||||
|
</default>
|
||||||
|
<null/>
|
||||||
|
</java.beans.PropertyChangeSupport>
|
||||||
|
</listeners>
|
||||||
|
<source class="net.java.amateras.db.visual.model.TableModel">
|
||||||
|
<listeners serialization="custom">
|
||||||
|
<java.beans.PropertyChangeSupport>
|
||||||
|
<default>
|
||||||
|
<source class="net.java.amateras.db.visual.model.TableModel" reference="../../../.."/>
|
||||||
|
<propertyChangeSupportSerializedDataVersion>2</propertyChangeSupportSerializedDataVersion>
|
||||||
|
</default>
|
||||||
|
<null/>
|
||||||
|
</java.beans.PropertyChangeSupport>
|
||||||
|
</listeners>
|
||||||
|
<constraint>
|
||||||
|
<height>-1</height>
|
||||||
|
<width>-1</width>
|
||||||
|
<x>432</x>
|
||||||
|
<y>240</y>
|
||||||
|
</constraint>
|
||||||
|
<sourceConnections>
|
||||||
|
<net.java.amateras.db.visual.model.ForeignKeyModel reference="../../.."/>
|
||||||
|
<net.java.amateras.db.visual.model.ForeignKeyModel>
|
||||||
|
<listeners serialization="custom">
|
||||||
|
<java.beans.PropertyChangeSupport>
|
||||||
|
<default>
|
||||||
|
<source class="net.java.amateras.db.visual.model.ForeignKeyModel" reference="../../../.."/>
|
||||||
|
<propertyChangeSupportSerializedDataVersion>2</propertyChangeSupportSerializedDataVersion>
|
||||||
|
</default>
|
||||||
|
<null/>
|
||||||
|
</java.beans.PropertyChangeSupport>
|
||||||
|
</listeners>
|
||||||
|
<source class="net.java.amateras.db.visual.model.TableModel" reference="../../.."/>
|
||||||
|
<target class="net.java.amateras.db.visual.model.TableModel" reference="../../../../../.."/>
|
||||||
|
<foreignKeyName>GROUP_MEMBER_FK_2</foreignKeyName>
|
||||||
|
<references/>
|
||||||
|
</net.java.amateras.db.visual.model.ForeignKeyModel>
|
||||||
|
</sourceConnections>
|
||||||
|
<targetConnections/>
|
||||||
|
<error></error>
|
||||||
|
<linkedPath></linkedPath>
|
||||||
|
<tableName>GROUP_MEMBER</tableName>
|
||||||
|
<logicalName>Group Member</logicalName>
|
||||||
|
<description>Since 1.4</description>
|
||||||
|
<columns>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<columnName>GROUP_NAME</columnName>
|
||||||
|
<logicalName>Group Name</logicalName>
|
||||||
|
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../../../../net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/columns/net.java.amateras.db.visual.model.ColumnModel[4]/columnType"/>
|
||||||
|
<size>100</size>
|
||||||
|
<notNull>true</notNull>
|
||||||
|
<primaryKey>true</primaryKey>
|
||||||
|
<description></description>
|
||||||
|
<autoIncrement>false</autoIncrement>
|
||||||
|
<defaultValue></defaultValue>
|
||||||
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<columnName>USER_NAME</columnName>
|
||||||
|
<logicalName>User Name</logicalName>
|
||||||
|
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../../../../net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/columns/net.java.amateras.db.visual.model.ColumnModel[4]/columnType"/>
|
||||||
|
<size>100</size>
|
||||||
|
<notNull>true</notNull>
|
||||||
|
<primaryKey>true</primaryKey>
|
||||||
|
<description></description>
|
||||||
|
<autoIncrement>false</autoIncrement>
|
||||||
|
<defaultValue></defaultValue>
|
||||||
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
</columns>
|
||||||
|
<indices/>
|
||||||
|
<backgroundColor>
|
||||||
|
<red>255</red>
|
||||||
|
<green>255</green>
|
||||||
|
<blue>206</blue>
|
||||||
|
</backgroundColor>
|
||||||
|
<sql></sql>
|
||||||
|
</source>
|
||||||
|
<target class="net.java.amateras.db.visual.model.TableModel" reference="../../.."/>
|
||||||
|
<foreignKeyName>GROUP_MEMBER_FK_1</foreignKeyName>
|
||||||
|
<references>
|
||||||
|
<entry>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel reference="../../../../net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[3]/references/entry/net.java.amateras.db.visual.model.ColumnModel"/>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel reference="../../../source/columns/net.java.amateras.db.visual.model.ColumnModel"/>
|
||||||
|
</entry>
|
||||||
|
</references>
|
||||||
|
</net.java.amateras.db.visual.model.ForeignKeyModel>
|
||||||
|
<net.java.amateras.db.visual.model.ForeignKeyModel reference="../net.java.amateras.db.visual.model.ForeignKeyModel[6]/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]"/>
|
||||||
</targetConnections>
|
</targetConnections>
|
||||||
<error></error>
|
<error></error>
|
||||||
<linkedPath></linkedPath>
|
<linkedPath></linkedPath>
|
||||||
@@ -1089,8 +1522,8 @@
|
|||||||
<net.java.amateras.db.visual.model.ColumnModel>
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
<columnName>PASSWORD</columnName>
|
<columnName>PASSWORD</columnName>
|
||||||
<logicalName>Password</logicalName>
|
<logicalName>Password</logicalName>
|
||||||
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../net.java.amateras.db.visual.model.ColumnModel[2]/columnType"/>
|
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../../targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/columns/net.java.amateras.db.visual.model.ColumnModel[4]/columnType"/>
|
||||||
<size>20</size>
|
<size>40</size>
|
||||||
<notNull>true</notNull>
|
<notNull>true</notNull>
|
||||||
<primaryKey>false</primaryKey>
|
<primaryKey>false</primaryKey>
|
||||||
<description></description>
|
<description></description>
|
||||||
@@ -1098,18 +1531,18 @@
|
|||||||
<defaultValue></defaultValue>
|
<defaultValue></defaultValue>
|
||||||
</net.java.amateras.db.visual.model.ColumnModel>
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
<net.java.amateras.db.visual.model.ColumnModel>
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
<columnName>USER_TYPE</columnName>
|
<columnName>ADMINISTRATOR</columnName>
|
||||||
<logicalName>User Type</logicalName>
|
<logicalName>Administrator</logicalName>
|
||||||
<columnType class="net.java.amateras.db.dialect.ColumnType">
|
<columnType class="net.java.amateras.db.dialect.ColumnType">
|
||||||
<name>INT</name>
|
<name>BOOLEAN</name>
|
||||||
<logicalName>整数</logicalName>
|
<logicalName>真偽値</logicalName>
|
||||||
<supportSize>false</supportSize>
|
<supportSize>false</supportSize>
|
||||||
<type>4</type>
|
<type>16</type>
|
||||||
</columnType>
|
</columnType>
|
||||||
<size>10</size>
|
<size>10</size>
|
||||||
<notNull>true</notNull>
|
<notNull>true</notNull>
|
||||||
<primaryKey>false</primaryKey>
|
<primaryKey>false</primaryKey>
|
||||||
<description>0:Normal 1:Administrator</description>
|
<description></description>
|
||||||
<autoIncrement>false</autoIncrement>
|
<autoIncrement>false</autoIncrement>
|
||||||
<defaultValue>0</defaultValue>
|
<defaultValue>0</defaultValue>
|
||||||
</net.java.amateras.db.visual.model.ColumnModel>
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
@@ -1157,6 +1590,33 @@
|
|||||||
<autoIncrement>false</autoIncrement>
|
<autoIncrement>false</autoIncrement>
|
||||||
<defaultValue></defaultValue>
|
<defaultValue></defaultValue>
|
||||||
</net.java.amateras.db.visual.model.ColumnModel>
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<columnName>IMAGE</columnName>
|
||||||
|
<logicalName>Image</logicalName>
|
||||||
|
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../../targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/columns/net.java.amateras.db.visual.model.ColumnModel[5]/columnType"/>
|
||||||
|
<size>100</size>
|
||||||
|
<notNull>false</notNull>
|
||||||
|
<primaryKey>false</primaryKey>
|
||||||
|
<description>Since 1.3</description>
|
||||||
|
<autoIncrement>false</autoIncrement>
|
||||||
|
<defaultValue></defaultValue>
|
||||||
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<columnName>GROUP_ACCOUNT</columnName>
|
||||||
|
<logicalName>Group Account</logicalName>
|
||||||
|
<columnType class="net.java.amateras.db.dialect.ColumnType">
|
||||||
|
<name>BOOLEAN</name>
|
||||||
|
<logicalName>真偽値</logicalName>
|
||||||
|
<supportSize>false</supportSize>
|
||||||
|
<type>16</type>
|
||||||
|
</columnType>
|
||||||
|
<size>10</size>
|
||||||
|
<notNull>true</notNull>
|
||||||
|
<primaryKey>false</primaryKey>
|
||||||
|
<description>Since 1.4</description>
|
||||||
|
<autoIncrement>false</autoIncrement>
|
||||||
|
<defaultValue>FALSE</defaultValue>
|
||||||
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
</columns>
|
</columns>
|
||||||
<indices>
|
<indices>
|
||||||
<net.java.amateras.db.visual.model.IndexModel>
|
<net.java.amateras.db.visual.model.IndexModel>
|
||||||
@@ -1184,6 +1644,91 @@
|
|||||||
<net.java.amateras.db.visual.model.TableModel reference="../net.java.amateras.db.visual.model.TableModel/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target"/>
|
<net.java.amateras.db.visual.model.TableModel reference="../net.java.amateras.db.visual.model.TableModel/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target"/>
|
||||||
<net.java.amateras.db.visual.model.TableModel reference="../net.java.amateras.db.visual.model.TableModel/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source"/>
|
<net.java.amateras.db.visual.model.TableModel reference="../net.java.amateras.db.visual.model.TableModel/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source"/>
|
||||||
<net.java.amateras.db.visual.model.TableModel reference="../net.java.amateras.db.visual.model.TableModel/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel[3]/source"/>
|
<net.java.amateras.db.visual.model.TableModel reference="../net.java.amateras.db.visual.model.TableModel/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel[3]/source"/>
|
||||||
|
<net.java.amateras.db.visual.model.TableModel reference="../net.java.amateras.db.visual.model.TableModel/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel[6]/source"/>
|
||||||
|
<net.java.amateras.db.visual.model.TableModel reference="../net.java.amateras.db.visual.model.TableModel/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel[7]/source"/>
|
||||||
|
<net.java.amateras.db.visual.model.TableModel reference="../net.java.amateras.db.visual.model.TableModel/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel[6]/source"/>
|
||||||
|
<net.java.amateras.db.visual.model.TableModel>
|
||||||
|
<listeners serialization="custom">
|
||||||
|
<java.beans.PropertyChangeSupport>
|
||||||
|
<default>
|
||||||
|
<source class="net.java.amateras.db.visual.model.TableModel" reference="../../../.."/>
|
||||||
|
<propertyChangeSupportSerializedDataVersion>2</propertyChangeSupportSerializedDataVersion>
|
||||||
|
</default>
|
||||||
|
<null/>
|
||||||
|
</java.beans.PropertyChangeSupport>
|
||||||
|
</listeners>
|
||||||
|
<constraint>
|
||||||
|
<height>-1</height>
|
||||||
|
<width>-1</width>
|
||||||
|
<x>410</x>
|
||||||
|
<y>860</y>
|
||||||
|
</constraint>
|
||||||
|
<sourceConnections/>
|
||||||
|
<targetConnections/>
|
||||||
|
<error></error>
|
||||||
|
<linkedPath></linkedPath>
|
||||||
|
<tableName>ISSUE_OUTLINE_VIEW</tableName>
|
||||||
|
<logicalName>Issue Outline View</logicalName>
|
||||||
|
<description>Since 1.4</description>
|
||||||
|
<columns>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<columnName>USER_NAME</columnName>
|
||||||
|
<logicalName>User Name</logicalName>
|
||||||
|
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../../../net.java.amateras.db.visual.model.TableModel/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/columns/net.java.amateras.db.visual.model.ColumnModel[5]/columnType"/>
|
||||||
|
<size>100</size>
|
||||||
|
<notNull>false</notNull>
|
||||||
|
<primaryKey>false</primaryKey>
|
||||||
|
<description></description>
|
||||||
|
<autoIncrement>false</autoIncrement>
|
||||||
|
<defaultValue></defaultValue>
|
||||||
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<columnName>REPOSITORY_NAME</columnName>
|
||||||
|
<logicalName>Repository Name</logicalName>
|
||||||
|
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../../../net.java.amateras.db.visual.model.TableModel/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/source/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/sourceConnections/net.java.amateras.db.visual.model.ForeignKeyModel[2]/target/targetConnections/net.java.amateras.db.visual.model.ForeignKeyModel/source/columns/net.java.amateras.db.visual.model.ColumnModel[5]/columnType"/>
|
||||||
|
<size>100</size>
|
||||||
|
<notNull>false</notNull>
|
||||||
|
<primaryKey>false</primaryKey>
|
||||||
|
<description></description>
|
||||||
|
<autoIncrement>false</autoIncrement>
|
||||||
|
<defaultValue></defaultValue>
|
||||||
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<columnName>ISSUE_ID</columnName>
|
||||||
|
<logicalName>Issue ID</logicalName>
|
||||||
|
<columnType class="net.java.amateras.db.dialect.ColumnType">
|
||||||
|
<name>INT</name>
|
||||||
|
<logicalName>整数</logicalName>
|
||||||
|
<supportSize>false</supportSize>
|
||||||
|
<type>4</type>
|
||||||
|
</columnType>
|
||||||
|
<size>10</size>
|
||||||
|
<notNull>false</notNull>
|
||||||
|
<primaryKey>false</primaryKey>
|
||||||
|
<description></description>
|
||||||
|
<autoIncrement>false</autoIncrement>
|
||||||
|
<defaultValue></defaultValue>
|
||||||
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
<columnName>COMMENT_COUNT</columnName>
|
||||||
|
<logicalName>Comment Count</logicalName>
|
||||||
|
<columnType class="net.java.amateras.db.dialect.ColumnType" reference="../../net.java.amateras.db.visual.model.ColumnModel[3]/columnType"/>
|
||||||
|
<size>10</size>
|
||||||
|
<notNull>false</notNull>
|
||||||
|
<primaryKey>false</primaryKey>
|
||||||
|
<description></description>
|
||||||
|
<autoIncrement>false</autoIncrement>
|
||||||
|
<defaultValue></defaultValue>
|
||||||
|
</net.java.amateras.db.visual.model.ColumnModel>
|
||||||
|
</columns>
|
||||||
|
<indices/>
|
||||||
|
<backgroundColor>
|
||||||
|
<red>210</red>
|
||||||
|
<green>232</green>
|
||||||
|
<blue>249</blue>
|
||||||
|
</backgroundColor>
|
||||||
|
<sql></sql>
|
||||||
|
</net.java.amateras.db.visual.model.TableModel>
|
||||||
</children>
|
</children>
|
||||||
<dommains/>
|
<dommains/>
|
||||||
<dialectName>H2</dialectName>
|
<dialectName>H2</dialectName>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.1.2")
|
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.1.2")
|
||||||
|
|
||||||
addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.2.0")
|
addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.5.1")
|
||||||
|
|
||||||
addSbtPlugin("org.scalatra.sbt" % "scalatra-sbt" % "0.2.0")
|
addSbtPlugin("org.scalatra.sbt" % "scalatra-sbt" % "0.2.0")
|
||||||
|
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ trait AccountControllerBase extends AccountManagementControllerBase with FlashMa
|
|||||||
case _ =>
|
case _ =>
|
||||||
_root_.account.html.repositories(account,
|
_root_.account.html.repositories(account,
|
||||||
if(account.isGroupAccount) Nil else getGroupsByUserName(userName),
|
if(account.isGroupAccount) Nil else getGroupsByUserName(userName),
|
||||||
getVisibleRepositories(userName, baseUrl, context.loginAccount.map(_.userName)))
|
getVisibleRepositories(context.loginAccount, baseUrl, Some(userName)))
|
||||||
}
|
}
|
||||||
} getOrElse NotFound
|
} getOrElse NotFound
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,14 +33,22 @@ trait DashboardControllerBase extends ControllerBase {
|
|||||||
|
|
||||||
session.put(sessionKey, condition)
|
session.put(sessionKey, condition)
|
||||||
|
|
||||||
val repositories = getAccessibleRepositories(context.loginAccount, baseUrl)
|
val userName = context.loginAccount.get.userName
|
||||||
|
val repositories = getUserRepositories(userName, baseUrl).map(repo => repo.owner -> repo.name)
|
||||||
|
val filterUser = Map(filter -> userName)
|
||||||
|
val page = IssueSearchCondition.page(request)
|
||||||
//
|
//
|
||||||
dashboard.html.issues(
|
dashboard.html.issues(
|
||||||
issues.html.listparts(Nil, 0, 0, 0, condition),
|
issues.html.listparts(
|
||||||
0,
|
searchIssue(condition, filterUser, (page - 1) * IssueLimit, IssueLimit, repositories: _*),
|
||||||
0,
|
page,
|
||||||
0,
|
countIssue(condition.copy(state = "open"), filterUser, repositories: _*),
|
||||||
repositories,
|
countIssue(condition.copy(state = "closed"), filterUser, repositories: _*),
|
||||||
|
condition),
|
||||||
|
countIssue(condition, Map.empty, repositories: _*),
|
||||||
|
countIssue(condition, Map("assigned" -> userName), repositories: _*),
|
||||||
|
countIssue(condition, Map("created_by" -> userName), repositories: _*),
|
||||||
|
countIssueGroupByRepository(condition, filterUser, repositories: _*),
|
||||||
condition,
|
condition,
|
||||||
filter)
|
filter)
|
||||||
|
|
||||||
|
|||||||
@@ -16,19 +16,22 @@ trait IndexControllerBase extends ControllerBase {
|
|||||||
val loginAccount = context.loginAccount
|
val loginAccount = context.loginAccount
|
||||||
|
|
||||||
html.index(getRecentActivities(),
|
html.index(getRecentActivities(),
|
||||||
getAccessibleRepositories(loginAccount, baseUrl),
|
getVisibleRepositories(loginAccount, baseUrl),
|
||||||
loadSystemSettings(),
|
loadSystemSettings(),
|
||||||
loginAccount.map{ account => getRepositoryNamesOfUser(account.userName) }.getOrElse(Nil)
|
loginAccount.map{ account => getUserRepositories(account.userName, baseUrl) }.getOrElse(Nil)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* JSON API for collaborator completion.
|
* JSON API for collaborator completion.
|
||||||
|
*
|
||||||
|
* TODO Move to other controller?
|
||||||
*/
|
*/
|
||||||
// TODO Move to other controller?
|
|
||||||
get("/_user/proposals")(usersOnly {
|
get("/_user/proposals")(usersOnly {
|
||||||
contentType = formats("json")
|
contentType = formats("json")
|
||||||
org.json4s.jackson.Serialization.write(Map("options" -> getAllUsers.filter(!_.isGroupAccount).map(_.userName).toArray))
|
org.json4s.jackson.Serialization.write(
|
||||||
|
Map("options" -> getAllUsers.filter(!_.isGroupAccount).map(_.userName).toArray)
|
||||||
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -301,16 +301,10 @@ trait IssuesControllerBase extends ControllerBase {
|
|||||||
private def searchIssues(filter: String, repository: RepositoryService.RepositoryInfo) = {
|
private def searchIssues(filter: String, repository: RepositoryService.RepositoryInfo) = {
|
||||||
val owner = repository.owner
|
val owner = repository.owner
|
||||||
val repoName = repository.name
|
val repoName = repository.name
|
||||||
val userName = if(filter != "all") Some(params("userName")) else None
|
val filterUser = Map(filter -> params.getOrElse("userName", ""))
|
||||||
|
val page = IssueSearchCondition.page(request)
|
||||||
val sessionKey = s"${owner}/${repoName}/issues"
|
val sessionKey = s"${owner}/${repoName}/issues"
|
||||||
|
|
||||||
val page = try {
|
|
||||||
val i = params.getOrElse("page", "1").toInt
|
|
||||||
if(i <= 0) 1 else i
|
|
||||||
} catch {
|
|
||||||
case e: NumberFormatException => 1
|
|
||||||
}
|
|
||||||
|
|
||||||
// retrieve search condition
|
// retrieve search condition
|
||||||
val condition = if(request.getQueryString == null){
|
val condition = if(request.getQueryString == null){
|
||||||
session.get(sessionKey).getOrElse(IssueSearchCondition()).asInstanceOf[IssueSearchCondition]
|
session.get(sessionKey).getOrElse(IssueSearchCondition()).asInstanceOf[IssueSearchCondition]
|
||||||
@@ -319,17 +313,17 @@ trait IssuesControllerBase extends ControllerBase {
|
|||||||
session.put(sessionKey, condition)
|
session.put(sessionKey, condition)
|
||||||
|
|
||||||
issues.html.list(
|
issues.html.list(
|
||||||
searchIssue(owner, repoName, condition, filter, userName, (page - 1) * IssueLimit, IssueLimit),
|
searchIssue(condition, filterUser, (page - 1) * IssueLimit, IssueLimit, owner -> repoName),
|
||||||
page,
|
page,
|
||||||
(getCollaborators(owner, repoName) :+ owner).sorted,
|
(getCollaborators(owner, repoName) :+ owner).sorted,
|
||||||
getMilestones(owner, repoName),
|
getMilestones(owner, repoName),
|
||||||
getLabels(owner, repoName),
|
getLabels(owner, repoName),
|
||||||
countIssue(owner, repoName, condition.copy(state = "open"), filter, userName),
|
countIssue(condition.copy(state = "open"), filterUser, owner -> repoName),
|
||||||
countIssue(owner, repoName, condition.copy(state = "closed"), filter, userName),
|
countIssue(condition.copy(state = "closed"), filterUser, owner -> repoName),
|
||||||
countIssue(owner, repoName, condition, "all", None),
|
countIssue(condition, Map.empty, owner -> repoName),
|
||||||
context.loginAccount.map(x => countIssue(owner, repoName, condition, "assigned", Some(x.userName))),
|
context.loginAccount.map(x => countIssue(condition, Map("assigned" -> x.userName), owner -> repoName)),
|
||||||
context.loginAccount.map(x => countIssue(owner, repoName, condition, "created_by", Some(x.userName))),
|
context.loginAccount.map(x => countIssue(condition, Map("created_by" -> x.userName), owner -> repoName)),
|
||||||
countIssueGroupByLabels(owner, repoName, condition, filter, userName),
|
countIssueGroupByLabels(owner, repoName, condition, filterUser),
|
||||||
condition,
|
condition,
|
||||||
filter,
|
filter,
|
||||||
repository,
|
repository,
|
||||||
|
|||||||
@@ -37,49 +37,29 @@ trait RepositoryViewerControllerBase extends ControllerBase {
|
|||||||
fileList(_)
|
fileList(_)
|
||||||
})
|
})
|
||||||
|
|
||||||
/**
|
|
||||||
* Displays the file list of the repository root and the specified branch.
|
|
||||||
*/
|
|
||||||
get("/:owner/:repository/tree/:id")(referrersOnly {
|
|
||||||
fileList(_, params("id"))
|
|
||||||
})
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Displays the file list of the specified path and branch.
|
* Displays the file list of the specified path and branch.
|
||||||
*/
|
*/
|
||||||
get("/:owner/:repository/tree/:id/*")(referrersOnly {
|
get("/:owner/:repository/tree/*")(referrersOnly { repository =>
|
||||||
fileList(_, params("id"), multiParams("splat").head)
|
val (id, path) = splitPath(repository, multiParams("splat").head)
|
||||||
})
|
if(path.isEmpty){
|
||||||
|
fileList(repository, id)
|
||||||
/**
|
} else {
|
||||||
* Displays the commit list of the specified branch.
|
fileList(repository, id, path)
|
||||||
*/
|
|
||||||
get("/:owner/:repository/commits/:branch")(referrersOnly { repository =>
|
|
||||||
val branchName = params("branch")
|
|
||||||
val page = params.getOrElse("page", "1").toInt
|
|
||||||
JGitUtil.withGit(getRepositoryDir(repository.owner, repository.name)){ git =>
|
|
||||||
JGitUtil.getCommitLog(git, branchName, page, 30) match {
|
|
||||||
case Right((logs, hasNext)) =>
|
|
||||||
repo.html.commits(Nil, branchName, repository, logs.splitWith{ (commit1, commit2) =>
|
|
||||||
view.helpers.date(commit1.time) == view.helpers.date(commit2.time)
|
|
||||||
}, page, hasNext)
|
|
||||||
case Left(_) => NotFound
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Displays the commit list of the specified resource.
|
* Displays the commit list of the specified resource.
|
||||||
*/
|
*/
|
||||||
get("/:owner/:repository/commits/:branch/*")(referrersOnly { repository =>
|
get("/:owner/:repository/commits/*")(referrersOnly { repository =>
|
||||||
val branchName = params("branch")
|
val (branchName, path) = splitPath(repository, multiParams("splat").head)
|
||||||
val path = multiParams("splat").head //.replaceFirst("^tree/.+?/", "")
|
|
||||||
val page = params.getOrElse("page", "1").toInt
|
val page = params.getOrElse("page", "1").toInt
|
||||||
|
|
||||||
JGitUtil.withGit(getRepositoryDir(repository.owner, repository.name)){ git =>
|
JGitUtil.withGit(getRepositoryDir(repository.owner, repository.name)){ git =>
|
||||||
JGitUtil.getCommitLog(git, branchName, page, 30, path) match {
|
JGitUtil.getCommitLog(git, branchName, page, 30, path) match {
|
||||||
case Right((logs, hasNext)) =>
|
case Right((logs, hasNext)) =>
|
||||||
repo.html.commits(path.split("/").toList, branchName, repository,
|
repo.html.commits(if(path.isEmpty) Nil else path.split("/").toList, branchName, repository,
|
||||||
logs.splitWith{ (commit1, commit2) =>
|
logs.splitWith{ (commit1, commit2) =>
|
||||||
view.helpers.date(commit1.time) == view.helpers.date(commit2.time)
|
view.helpers.date(commit1.time) == view.helpers.date(commit2.time)
|
||||||
}, page, hasNext)
|
}, page, hasNext)
|
||||||
@@ -91,10 +71,9 @@ trait RepositoryViewerControllerBase extends ControllerBase {
|
|||||||
/**
|
/**
|
||||||
* Displays the file content of the specified branch or commit.
|
* Displays the file content of the specified branch or commit.
|
||||||
*/
|
*/
|
||||||
get("/:owner/:repository/blob/:id/*")(referrersOnly { repository =>
|
get("/:owner/:repository/blob/*")(referrersOnly { repository =>
|
||||||
val id = params("id") // branch name or commit id
|
val (id, path) = splitPath(repository, multiParams("splat").head)
|
||||||
val raw = params.get("raw").getOrElse("false").toBoolean
|
val raw = params.get("raw").getOrElse("false").toBoolean
|
||||||
val path = multiParams("splat").head //.replaceFirst("^tree/.+?/", "")
|
|
||||||
|
|
||||||
JGitUtil.withGit(getRepositoryDir(repository.owner, repository.name)){ git =>
|
JGitUtil.withGit(getRepositoryDir(repository.owner, repository.name)){ git =>
|
||||||
val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id))
|
val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id))
|
||||||
@@ -211,6 +190,16 @@ trait RepositoryViewerControllerBase extends ControllerBase {
|
|||||||
repository)
|
repository)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
private def splitPath(repository: service.RepositoryService.RepositoryInfo, path: String): (String, String) = {
|
||||||
|
val id = repository.branchList.collectFirst {
|
||||||
|
case branch if(path == branch || path.startsWith(branch + "/")) => branch
|
||||||
|
} orElse repository.tags.collectFirst {
|
||||||
|
case tag if(path == tag.name || path.startsWith(tag.name + "/")) => tag.name
|
||||||
|
} orElse Some(path) get
|
||||||
|
|
||||||
|
(id, path.substring(id.length).replaceFirst("^/", ""))
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides HTML of the file list.
|
* Provides HTML of the file list.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ trait SearchControllerBase extends ControllerBase { self: RepositoryService
|
|||||||
case class SearchForm(query: String, owner: String, repository: String)
|
case class SearchForm(query: String, owner: String, repository: String)
|
||||||
|
|
||||||
post("/search", searchForm){ form =>
|
post("/search", searchForm){ form =>
|
||||||
redirect(s"${form.owner}/${form.repository}/search?q=${StringUtil.urlEncode(form.query)}")
|
redirect(s"/${form.owner}/${form.repository}/search?q=${StringUtil.urlEncode(form.query)}")
|
||||||
}
|
}
|
||||||
|
|
||||||
get("/:owner/:repository/search")(referrersOnly { repository =>
|
get("/:owner/:repository/search")(referrersOnly { repository =>
|
||||||
|
|||||||
@@ -42,18 +42,16 @@ trait IssuesService {
|
|||||||
/**
|
/**
|
||||||
* Returns the count of the search result against issues.
|
* Returns the count of the search result against issues.
|
||||||
*
|
*
|
||||||
* @param owner the repository owner
|
|
||||||
* @param repository the repository name
|
|
||||||
* @param condition the search condition
|
* @param condition the search condition
|
||||||
* @param filter the filter type ("all", "assigned" or "created_by")
|
* @param filterUser the filter user name (key is "all", "assigned" or "created_by", value is the user name)
|
||||||
* @param userName the filter user name required for "assigned" and "created_by"
|
* @param repos Tuple of the repository owner and the repository name
|
||||||
* @return the count of the search result
|
* @return the count of the search result
|
||||||
*/
|
*/
|
||||||
def countIssue(owner: String, repository: String, condition: IssueSearchCondition, filter: String, userName: Option[String]): Int = {
|
def countIssue(condition: IssueSearchCondition, filterUser: Map[String, String], repos: (String, String)*): Int = {
|
||||||
// TODO It must be _.length instead of map (_.issueId) list).length.
|
// TODO It must be _.length instead of map (_.issueId) list).length.
|
||||||
// But it does not work on Slick 1.0.1 (worked on Slick 1.0.0).
|
// But it does not work on Slick 1.0.1 (worked on Slick 1.0.0).
|
||||||
// https://github.com/slick/slick/issues/170
|
// https://github.com/slick/slick/issues/170
|
||||||
(searchIssueQuery(owner, repository, condition, filter, userName) map (_.issueId) list).length
|
(searchIssueQuery(repos, condition, filterUser) map (_.issueId) list).length
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Returns the Map which contains issue count for each labels.
|
* Returns the Map which contains issue count for each labels.
|
||||||
@@ -61,14 +59,13 @@ trait IssuesService {
|
|||||||
* @param owner the repository owner
|
* @param owner the repository owner
|
||||||
* @param repository the repository name
|
* @param repository the repository name
|
||||||
* @param condition the search condition
|
* @param condition the search condition
|
||||||
* @param filter the filter type ("all", "assigned" or "created_by")
|
* @param filterUser the filter user name (key is "all", "assigned" or "created_by", value is the user name)
|
||||||
* @param userName the filter user name required for "assigned" and "created_by"
|
* @return the Map which contains issue count for each labels (key is label name, value is issue count)
|
||||||
* @return the Map which contains issue count for each labels (key is label name, value is issue count),
|
|
||||||
*/
|
*/
|
||||||
def countIssueGroupByLabels(owner: String, repository: String, condition: IssueSearchCondition,
|
def countIssueGroupByLabels(owner: String, repository: String, condition: IssueSearchCondition,
|
||||||
filter: String, userName: Option[String]): Map[String, Int] = {
|
filterUser: Map[String, String]): Map[String, Int] = {
|
||||||
|
|
||||||
searchIssueQuery(owner, repository, condition.copy(labels = Set.empty), filter, userName)
|
searchIssueQuery(Seq(owner -> repository), condition.copy(labels = Set.empty), filterUser)
|
||||||
.innerJoin(IssueLabels).on { (t1, t2) =>
|
.innerJoin(IssueLabels).on { (t1, t2) =>
|
||||||
t1.byIssue(t2.userName, t2.repositoryName, t2.issueId)
|
t1.byIssue(t2.userName, t2.repositoryName, t2.issueId)
|
||||||
}
|
}
|
||||||
@@ -83,24 +80,43 @@ trait IssuesService {
|
|||||||
}
|
}
|
||||||
.toMap
|
.toMap
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Returns list which contains issue count for each repository.
|
||||||
|
* If the issue does not exist, its repository is not included in the result.
|
||||||
|
*
|
||||||
|
* @param condition the search condition
|
||||||
|
* @param filterUser the filter user name (key is "all", "assigned" or "created_by", value is the user name)
|
||||||
|
* @param repos Tuple of the repository owner and the repository name
|
||||||
|
* @return list which contains issue count for each repository
|
||||||
|
*/
|
||||||
|
def countIssueGroupByRepository(condition: IssueSearchCondition, filterUser: Map[String, String],
|
||||||
|
repos: (String, String)*): List[(String, String, Int)] = {
|
||||||
|
searchIssueQuery(repos, condition.copy(repo = None), filterUser)
|
||||||
|
.groupBy { t =>
|
||||||
|
t.userName ~ t.repositoryName
|
||||||
|
}
|
||||||
|
.map { case (repo, t) =>
|
||||||
|
repo ~ t.length
|
||||||
|
}
|
||||||
|
.filter (_._3 > 0.bind)
|
||||||
|
.list
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the search result against issues.
|
* Returns the search result against issues.
|
||||||
*
|
*
|
||||||
* @param owner the repository owner
|
|
||||||
* @param repository the repository name
|
|
||||||
* @param condition the search condition
|
* @param condition the search condition
|
||||||
* @param filter the filter type ("all", "assigned" or "created_by")
|
* @param filterUser the filter user name (key is "all", "assigned" or "created_by", value is the user name)
|
||||||
* @param userName the filter user name required for "assigned" and "created_by"
|
|
||||||
* @param offset the offset for pagination
|
* @param offset the offset for pagination
|
||||||
* @param limit the limit for pagination
|
* @param limit the limit for pagination
|
||||||
|
* @param repos Tuple of the repository owner and the repository name
|
||||||
* @return the search result (list of tuples which contain issue, labels and comment count)
|
* @return the search result (list of tuples which contain issue, labels and comment count)
|
||||||
*/
|
*/
|
||||||
def searchIssue(owner: String, repository: String, condition: IssueSearchCondition,
|
def searchIssue(condition: IssueSearchCondition, filterUser: Map[String, String],
|
||||||
filter: String, userName: Option[String], offset: Int, limit: Int): List[(Issue, List[Label], Int)] = {
|
offset: Int, limit: Int, repos: (String, String)*): List[(Issue, List[Label], Int)] = {
|
||||||
|
|
||||||
// get issues and comment count and labels
|
// get issues and comment count and labels
|
||||||
searchIssueQuery(owner, repository, condition, filter, userName)
|
searchIssueQuery(repos, condition, filterUser)
|
||||||
.innerJoin(IssueOutline).on { (t1, t2) => t1.byIssue(t2.userName, t2.repositoryName, t2.issueId) }
|
.innerJoin(IssueOutline).on { (t1, t2) => t1.byIssue(t2.userName, t2.repositoryName, t2.issueId) }
|
||||||
.leftJoin (IssueLabels) .on { case ((t1, t2), t3) => t1.byIssue(t3.userName, t3.repositoryName, t3.issueId) }
|
.leftJoin (IssueLabels) .on { case ((t1, t2), t3) => t1.byIssue(t3.userName, t3.repositoryName, t3.issueId) }
|
||||||
.leftJoin (Labels) .on { case (((t1, t2), t3), t4) => t3.byLabel(t4.userName, t4.repositoryName, t4.labelId) }
|
.leftJoin (Labels) .on { case (((t1, t2), t3), t4) => t3.byLabel(t4.userName, t4.repositoryName, t4.labelId) }
|
||||||
@@ -122,7 +138,11 @@ trait IssuesService {
|
|||||||
}
|
}
|
||||||
.drop(offset).take(limit)
|
.drop(offset).take(limit)
|
||||||
.list
|
.list
|
||||||
.splitWith(_._1.issueId == _._1.issueId)
|
.splitWith { (c1, c2) =>
|
||||||
|
c1._1.userName == c2._1.userName &&
|
||||||
|
c1._1.repositoryName == c2._1.repositoryName &&
|
||||||
|
c1._1.issueId == c2._1.issueId
|
||||||
|
}
|
||||||
.map { issues => issues.head match {
|
.map { issues => issues.head match {
|
||||||
case (issue, commentCount, _,_,_) =>
|
case (issue, commentCount, _,_,_) =>
|
||||||
(issue,
|
(issue,
|
||||||
@@ -136,14 +156,18 @@ trait IssuesService {
|
|||||||
/**
|
/**
|
||||||
* Assembles query for conditional issue searching.
|
* Assembles query for conditional issue searching.
|
||||||
*/
|
*/
|
||||||
private def searchIssueQuery(owner: String, repository: String, condition: IssueSearchCondition, filter: String, userName: Option[String]) =
|
private def searchIssueQuery(repos: Seq[(String, String)], condition: IssueSearchCondition, filterUser: Map[String, String]) =
|
||||||
Query(Issues) filter { t1 =>
|
Query(Issues) filter { t1 =>
|
||||||
(t1.byRepository(owner, repository)) &&
|
condition.repo
|
||||||
|
.map { _.split('/') match { case array => Seq(array(0) -> array(1)) } }
|
||||||
|
.getOrElse (repos)
|
||||||
|
.map { case (owner, repository) => t1.byRepository(owner, repository) }
|
||||||
|
.foldLeft[Column[Boolean]](false) ( _ || _ ) &&
|
||||||
(t1.closed is (condition.state == "closed").bind) &&
|
(t1.closed is (condition.state == "closed").bind) &&
|
||||||
(t1.milestoneId is condition.milestoneId.get.get.bind, condition.milestoneId.flatten.isDefined) &&
|
(t1.milestoneId is condition.milestoneId.get.get.bind, condition.milestoneId.flatten.isDefined) &&
|
||||||
(t1.milestoneId isNull, condition.milestoneId == Some(None)) &&
|
(t1.milestoneId isNull, condition.milestoneId == Some(None)) &&
|
||||||
(t1.assignedUserName is userName.get.bind, filter == "assigned") &&
|
(t1.assignedUserName is filterUser("assigned").bind, filterUser.get("assigned").isDefined) &&
|
||||||
(t1.openedUserName is userName.get.bind, filter == "created_by") &&
|
(t1.openedUserName is filterUser("created_by").bind, filterUser.get("created_by").isDefined) &&
|
||||||
(IssueLabels filter { t2 =>
|
(IssueLabels filter { t2 =>
|
||||||
(t2.byIssue(t1.userName, t1.repositoryName, t1.issueId)) &&
|
(t2.byIssue(t1.userName, t1.repositoryName, t1.issueId)) &&
|
||||||
(t2.labelId in
|
(t2.labelId in
|
||||||
@@ -329,6 +353,13 @@ object IssuesService {
|
|||||||
param(request, "state", Seq("open", "closed")).getOrElse("open"),
|
param(request, "state", Seq("open", "closed")).getOrElse("open"),
|
||||||
param(request, "sort", Seq("created", "comments", "updated")).getOrElse("created"),
|
param(request, "sort", Seq("created", "comments", "updated")).getOrElse("created"),
|
||||||
param(request, "direction", Seq("asc", "desc")).getOrElse("desc"))
|
param(request, "direction", Seq("asc", "desc")).getOrElse("desc"))
|
||||||
|
|
||||||
|
def page(request: HttpServletRequest) = try {
|
||||||
|
val i = param(request, "page").getOrElse("1").toInt
|
||||||
|
if(i <= 0) 1 else i
|
||||||
|
} catch {
|
||||||
|
case e: NumberFormatException => 1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,45 +61,6 @@ trait RepositoryService { self: AccountService =>
|
|||||||
def getRepositoryNamesOfUser(userName: String): List[String] =
|
def getRepositoryNamesOfUser(userName: String): List[String] =
|
||||||
Query(Repositories) filter(_.userName is userName.bind) map (_.repositoryName) list
|
Query(Repositories) filter(_.userName is userName.bind) map (_.repositoryName) list
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the list of specified user's repositories information.
|
|
||||||
*
|
|
||||||
* @param userName the user name
|
|
||||||
* @param baseUrl the base url of this application
|
|
||||||
* @param loginUserName the logged in user name
|
|
||||||
* @return the list of repository information which is sorted in descending order of lastActivityDate.
|
|
||||||
*/
|
|
||||||
def getVisibleRepositories(userName: String, baseUrl: String, loginUserName: Option[String]): List[RepositoryInfo] = {
|
|
||||||
val q1 = Repositories
|
|
||||||
.filter { t => t.userName is userName.bind }
|
|
||||||
.map { r => r }
|
|
||||||
|
|
||||||
val q2 = Collaborators
|
|
||||||
.innerJoin(Repositories).on((t1, t2) => t1.byRepository(t2.userName, t2.repositoryName))
|
|
||||||
.filter{ case (t1, t2) => t1.collaboratorName is userName.bind}
|
|
||||||
.map { case (t1, t2) => t2 }
|
|
||||||
|
|
||||||
def visibleFor(t: Repositories.type, loginUserName: Option[String]) = {
|
|
||||||
loginUserName match {
|
|
||||||
case Some(x) => (t.isPrivate is false.bind) || (
|
|
||||||
(t.isPrivate is true.bind) && ((t.userName is x.bind) || (Collaborators.filter { c =>
|
|
||||||
c.byRepository(t.userName, t.repositoryName) && (c.collaboratorName is x.bind)
|
|
||||||
}.exists)))
|
|
||||||
case None => (t.isPrivate is false.bind)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
q1.union(q2).filter(visibleFor(_, loginUserName)).sortBy(_.lastActivityDate desc).list map { repository =>
|
|
||||||
new RepositoryInfo(
|
|
||||||
JGitUtil.getRepositoryInfo(repository.userName, repository.repositoryName, baseUrl),
|
|
||||||
repository,
|
|
||||||
getForkedCount(
|
|
||||||
repository.originUserName.getOrElse(repository.userName),
|
|
||||||
repository.originRepositoryName.getOrElse(repository.repositoryName)
|
|
||||||
))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the specified repository information.
|
* Returns the specified repository information.
|
||||||
*
|
*
|
||||||
@@ -120,16 +81,11 @@ trait RepositoryService { self: AccountService =>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
def getUserRepositories(userName: String, baseUrl: String): List[RepositoryInfo] = {
|
||||||
* Returns the list of accessible repositories information for the specified account user.
|
Query(Repositories).filter { t1 =>
|
||||||
*
|
(t1.userName is userName.bind) ||
|
||||||
* @param account the account
|
(Query(Collaborators).filter { t2 => t2.byRepository(t1.userName, t1.repositoryName) && (t2.collaboratorName is userName.bind)} exists)
|
||||||
* @param baseUrl the base url of this application
|
}.sortBy(_.lastActivityDate desc).list.map{ repository =>
|
||||||
* @return the repository informations which is sorted in descending order of lastActivityDate.
|
|
||||||
*/
|
|
||||||
def getAccessibleRepositories(account: Option[Account], baseUrl: String): List[RepositoryInfo] = {
|
|
||||||
|
|
||||||
def newRepositoryInfo(repository: Repository): RepositoryInfo = {
|
|
||||||
new RepositoryInfo(
|
new RepositoryInfo(
|
||||||
JGitUtil.getRepositoryInfo(repository.userName, repository.repositoryName, baseUrl),
|
JGitUtil.getRepositoryInfo(repository.userName, repository.repositoryName, baseUrl),
|
||||||
repository,
|
repository,
|
||||||
@@ -138,18 +94,39 @@ trait RepositoryService { self: AccountService =>
|
|||||||
repository.originRepositoryName.getOrElse(repository.repositoryName)
|
repository.originRepositoryName.getOrElse(repository.repositoryName)
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
(account match {
|
/**
|
||||||
|
* Returns the list of visible repositories for the specified user.
|
||||||
|
* If repositoryUserName is given then filters results by repository owner.
|
||||||
|
*
|
||||||
|
* @param loginAccount the logged in account
|
||||||
|
* @param baseUrl the base url of this application
|
||||||
|
* @param repositoryUserName the repository owner (if None then returns all repositories which are visible for logged in user)
|
||||||
|
* @return the repository information which is sorted in descending order of lastActivityDate.
|
||||||
|
*/
|
||||||
|
def getVisibleRepositories(loginAccount: Option[Account], baseUrl: String, repositoryUserName: Option[String] = None): List[RepositoryInfo] = {
|
||||||
|
(loginAccount match {
|
||||||
// for Administrators
|
// for Administrators
|
||||||
case Some(x) if(x.isAdmin) => Query(Repositories)
|
case Some(x) if(x.isAdmin) => Query(Repositories)
|
||||||
// for Normal Users
|
// for Normal Users
|
||||||
case Some(x) if(!x.isAdmin) =>
|
case Some(x) if(!x.isAdmin) =>
|
||||||
Query(Repositories) filter { t => (t.isPrivate is false.bind) ||
|
Query(Repositories) filter { t => (t.isPrivate is false.bind) ||
|
||||||
(Query(Collaborators).filter(t2 => t2.byRepository(t.userName, t.repositoryName) && (t2.collaboratorName is x.userName.bind)) exists)
|
(Query(Collaborators).filter { t2 => t2.byRepository(t.userName, t.repositoryName) && (t2.collaboratorName is x.userName.bind)} exists)
|
||||||
}
|
}
|
||||||
// for Guests
|
// for Guests
|
||||||
case None => Query(Repositories) filter(_.isPrivate is false.bind)
|
case None => Query(Repositories) filter(_.isPrivate is false.bind)
|
||||||
}).sortBy(_.lastActivityDate desc).list.map(newRepositoryInfo _)
|
}).filter { t =>
|
||||||
|
repositoryUserName.map { userName => t.userName is userName.bind } getOrElse ConstColumn.TRUE
|
||||||
|
}.sortBy(_.lastActivityDate desc).list.map{ repository =>
|
||||||
|
new RepositoryInfo(
|
||||||
|
JGitUtil.getRepositoryInfo(repository.userName, repository.repositoryName, baseUrl),
|
||||||
|
repository,
|
||||||
|
getForkedCount(
|
||||||
|
repository.originUserName.getOrElse(repository.userName),
|
||||||
|
repository.originRepositoryName.getOrElse(repository.repositoryName)
|
||||||
|
))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -133,15 +133,18 @@ object JGitUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns RevCommit from the commit id.
|
* Returns RevCommit from the commit or tag id.
|
||||||
*
|
*
|
||||||
* @param git the Git object
|
* @param git the Git object
|
||||||
* @param commitId the ObjectId of the commit
|
* @param objectId the ObjectId of the commit or tag
|
||||||
* @return the RevCommit for the specified commit
|
* @return the RevCommit for the specified commit or tag
|
||||||
*/
|
*/
|
||||||
def getRevCommitFromId(git: Git, commitId: ObjectId): RevCommit = {
|
def getRevCommitFromId(git: Git, objectId: ObjectId): RevCommit = {
|
||||||
val revWalk = new RevWalk(git.getRepository)
|
val revWalk = new RevWalk(git.getRepository)
|
||||||
val revCommit = revWalk.parseCommit(commitId)
|
val revCommit = revWalk.parseAny(objectId) match {
|
||||||
|
case r: RevTag => revWalk.parseCommit(r.getObject)
|
||||||
|
case _ => revWalk.parseCommit(objectId)
|
||||||
|
}
|
||||||
revWalk.dispose
|
revWalk.dispose
|
||||||
revCommit
|
revCommit
|
||||||
}
|
}
|
||||||
@@ -349,51 +352,11 @@ object JGitUtil {
|
|||||||
* @return the list of latest commit
|
* @return the list of latest commit
|
||||||
*/
|
*/
|
||||||
def getLatestCommitFromPaths(git: Git, paths: List[String], revision: String): Map[String, RevCommit] = {
|
def getLatestCommitFromPaths(git: Git, paths: List[String], revision: String): Map[String, RevCommit] = {
|
||||||
|
val start = getRevCommitFromId(git, git.getRepository.resolve(revision))
|
||||||
val map = new scala.collection.mutable.HashMap[String, RevCommit]
|
paths.map { path =>
|
||||||
|
val commit = git.log.add(start).addPath(path).setMaxCount(1).call.iterator.next
|
||||||
val revWalk = new RevWalk(git.getRepository)
|
(path, commit)
|
||||||
revWalk.markStart(revWalk.parseCommit(git.getRepository.resolve(revision)))
|
}.toMap
|
||||||
//revWalk.sort(RevSort.REVERSE);
|
|
||||||
val i = revWalk.iterator
|
|
||||||
|
|
||||||
while(i.hasNext && map.size != paths.length){
|
|
||||||
val commit = i.next
|
|
||||||
if(commit.getParentCount == 0){
|
|
||||||
// Initial commit
|
|
||||||
val treeWalk = new TreeWalk(git.getRepository)
|
|
||||||
treeWalk.reset()
|
|
||||||
treeWalk.setRecursive(true)
|
|
||||||
treeWalk.addTree(commit.getTree)
|
|
||||||
while (treeWalk.next) {
|
|
||||||
paths.foreach { path =>
|
|
||||||
if(treeWalk.getPathString.startsWith(path) && !map.contains(path)){
|
|
||||||
map.put(path, commit)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
treeWalk.release
|
|
||||||
} else {
|
|
||||||
(0 to commit.getParentCount - 1).foreach { i =>
|
|
||||||
val parent = revWalk.parseCommit(commit.getParent(i).getId())
|
|
||||||
val df = new DiffFormatter(DisabledOutputStream.INSTANCE)
|
|
||||||
df.setRepository(git.getRepository)
|
|
||||||
df.setDiffComparator(RawTextComparator.DEFAULT)
|
|
||||||
df.setDetectRenames(true)
|
|
||||||
val diffs = df.scan(parent.getTree(), commit.getTree)
|
|
||||||
diffs.asScala.foreach { diff =>
|
|
||||||
paths.foreach { path =>
|
|
||||||
if(diff.getChangeType != ChangeType.DELETE && diff.getNewPath.startsWith(path) && !map.contains(path)){
|
|
||||||
map.put(path, commit)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
revWalk.release
|
|
||||||
}
|
|
||||||
map.toMap
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -12,8 +12,13 @@ trait AvatarImageProvider { self: RequestCache =>
|
|||||||
*/
|
*/
|
||||||
protected def getAvatarImageHtml(userName: String, size: Int,
|
protected def getAvatarImageHtml(userName: String, size: Int,
|
||||||
mailAddress: String = "", tooltip: Boolean = false)(implicit context: app.Context): Html = {
|
mailAddress: String = "", tooltip: Boolean = false)(implicit context: app.Context): Html = {
|
||||||
val src = getAccountByUserName(userName).collect { case account if(account.image.isEmpty) =>
|
|
||||||
|
val src = getAccountByUserName(userName).map { account =>
|
||||||
|
if(account.image.isEmpty){
|
||||||
s"""http://www.gravatar.com/avatar/${StringUtil.md5(account.mailAddress)}?s=${size}"""
|
s"""http://www.gravatar.com/avatar/${StringUtil.md5(account.mailAddress)}?s=${size}"""
|
||||||
|
} else {
|
||||||
|
s"""${context.path}/${userName}/_avatar"""
|
||||||
|
}
|
||||||
} getOrElse {
|
} getOrElse {
|
||||||
if(mailAddress.nonEmpty){
|
if(mailAddress.nonEmpty){
|
||||||
s"""http://www.gravatar.com/avatar/${StringUtil.md5(mailAddress)}?s=${size}"""
|
s"""http://www.gravatar.com/avatar/${StringUtil.md5(mailAddress)}?s=${size}"""
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
allCount: Int,
|
allCount: Int,
|
||||||
assignedCount: Int,
|
assignedCount: Int,
|
||||||
createdByCount: Int,
|
createdByCount: Int,
|
||||||
repositories: List[service.RepositoryService.RepositoryInfo],
|
repositories: List[(String, String, Int)],
|
||||||
condition: service.IssuesService.IssueSearchCondition,
|
condition: service.IssuesService.IssueSearchCondition,
|
||||||
filter: String)(implicit context: app.Context)
|
filter: String)(implicit context: app.Context)
|
||||||
@import context._
|
@import context._
|
||||||
@@ -13,19 +13,19 @@
|
|||||||
<div class="span3">
|
<div class="span3">
|
||||||
<ul class="nav nav-pills nav-stacked">
|
<ul class="nav nav-pills nav-stacked">
|
||||||
<li@if(filter == "all"){ class="active"}>
|
<li@if(filter == "all"){ class="active"}>
|
||||||
<a href="/dashboard/issues/repos@condition.toURL">
|
<a href="@path/dashboard/issues/repos@condition.toURL">
|
||||||
<span class="count-right">@allCount</span>
|
<span class="count-right">@allCount</span>
|
||||||
In your repositories
|
In your repositories
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li@if(filter == "assigned"){ class="active"}>
|
<li@if(filter == "assigned"){ class="active"}>
|
||||||
<a href="/dashboard/issues/assigned@condition.toURL">
|
<a href="@path/dashboard/issues/assigned@condition.toURL">
|
||||||
<span class="count-right">@assignedCount</span>
|
<span class="count-right">@assignedCount</span>
|
||||||
Assigned to you
|
Assigned to you
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li@if(filter == "created_by"){ class="active"}>
|
<li@if(filter == "created_by"){ class="active"}>
|
||||||
<a href="/dashboard/issues/created_by@condition.toURL">
|
<a href="@path/dashboard/issues/created_by@condition.toURL">
|
||||||
<span class="count-right">@createdByCount</span>
|
<span class="count-right">@createdByCount</span>
|
||||||
Created by you
|
Created by you
|
||||||
</a>
|
</a>
|
||||||
@@ -33,11 +33,11 @@
|
|||||||
</ul>
|
</ul>
|
||||||
<hr/>
|
<hr/>
|
||||||
<ul class="nav nav-pills nav-stacked small">
|
<ul class="nav nav-pills nav-stacked small">
|
||||||
@repositories.map { repository =>
|
@repositories.map { case (owner, name, count) =>
|
||||||
<li>
|
<li@if(condition.repo == Some(owner + "/" + name)){ class="active"}>
|
||||||
<a href="@condition.copy(repo = Some(repository.owner + "/" + repository.name)).toURL">
|
<a href="@condition.copy(repo = Some(owner + "/" + name)).toURL">
|
||||||
<span class="count-right">0</span>
|
<span class="count-right">@count</span>
|
||||||
@repository.owner/@repository.name
|
@owner/@name
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
@(active: String = "")(implicit context: app.Context)
|
@(active: String = "")(implicit context: app.Context)
|
||||||
@import context._
|
@import context._
|
||||||
<ul class="nav nav-tabs">
|
<ul class="nav nav-tabs">
|
||||||
<li@if(active == ""){ class="active"}><a href="/">News Feed</a></li>
|
<li@if(active == ""){ class="active"}><a href="@path/">News Feed</a></li>
|
||||||
@if(loginAccount.isDefined){
|
@if(loginAccount.isDefined){
|
||||||
<li@if(active == "issues"){ class="active"}><a href="/dashboard/issues/repos">Issues</a></li>
|
<li@if(active == "issues"){ class="active"}><a href="@path/dashboard/issues/repos">Issues</a></li>
|
||||||
}
|
}
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
@(activities: List[model.Activity],
|
@(activities: List[model.Activity],
|
||||||
repositories: List[service.RepositoryService.RepositoryInfo],
|
recentRepositories: List[service.RepositoryService.RepositoryInfo],
|
||||||
systemSettings: service.SystemSettingsService.SystemSettings,
|
systemSettings: service.SystemSettingsService.SystemSettings,
|
||||||
userRepositories: List[String])(implicit context: app.Context)
|
userRepositories: List[service.RepositoryService.RepositoryInfo])(implicit context: app.Context)
|
||||||
@import context._
|
@import context._
|
||||||
@import view.helpers._
|
@import view.helpers._
|
||||||
@main("GitBucket"){
|
@main("GitBucket"){
|
||||||
@@ -28,9 +28,15 @@
|
|||||||
<td>No repositories</td>
|
<td>No repositories</td>
|
||||||
</tr>
|
</tr>
|
||||||
} else {
|
} else {
|
||||||
@userRepositories.map { repositoryName =>
|
@userRepositories.map { repository =>
|
||||||
<tr>
|
<tr>
|
||||||
<td><a href="@path/@loginAccount.get.userName/@repositoryName"><strong>@repositoryName</strong></a></td>
|
<td>
|
||||||
|
@if(repository.owner == loginAccount.get.userName){
|
||||||
|
<a href="@url(repository)"><strong>@repository.name</strong></a>
|
||||||
|
} else {
|
||||||
|
<a href="@url(repository)">@repository.owner/<strong>@repository.name</strong></a>
|
||||||
|
}
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -43,12 +49,12 @@
|
|||||||
Recent updated repositories
|
Recent updated repositories
|
||||||
</th>
|
</th>
|
||||||
</tr>
|
</tr>
|
||||||
@if(repositories.isEmpty){
|
@if(recentRepositories.isEmpty){
|
||||||
<tr>
|
<tr>
|
||||||
<td>No repositories</td>
|
<td>No repositories</td>
|
||||||
</tr>
|
</tr>
|
||||||
} else {
|
} else {
|
||||||
@repositories.map { repository =>
|
@recentRepositories.map { repository =>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<a href="@url(repository)">@repository.owner/<strong>@repository.name</strong></a>
|
<a href="@url(repository)">@repository.owner/<strong>@repository.name</strong></a>
|
||||||
|
|||||||
@@ -146,7 +146,7 @@
|
|||||||
<input type="checkbox" value="@issue.issueId"/>
|
<input type="checkbox" value="@issue.issueId"/>
|
||||||
}
|
}
|
||||||
@if(repository.isEmpty){
|
@if(repository.isEmpty){
|
||||||
<a href="@path/@issue.userName/@issue.repositoryName">@issue.repositoryName</a> ・
|
<a href="@path/@issue.userName/@issue.repositoryName">@issue.repositoryName</a> ・
|
||||||
}
|
}
|
||||||
<a href="@path/@issue.userName/@issue.repositoryName/issues/@issue.issueId" class="issue-title">@issue.title</a>
|
<a href="@path/@issue.userName/@issue.repositoryName/issues/@issue.issueId" class="issue-title">@issue.title</a>
|
||||||
@labels.map { label =>
|
@labels.map { label =>
|
||||||
|
|||||||
@@ -26,9 +26,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
}
|
}
|
||||||
<li@if(active=="files"){ class="active"}><a href="@url(repository)/tree/@id">Files</a></li>
|
<li@if(active=="files" ){ class="active"}><a href="@url(repository)/tree/@id">Files</a></li>
|
||||||
<li@if(active=="commits"){ class="active"}><a href="@url(repository)/commits/@id">Commits</a></li>
|
<li@if(active=="commits"){ class="active"}><a href="@url(repository)/commits/@id">Commits</a></li>
|
||||||
<li@if(active=="tags"){ class="active"}><a href="@url(repository)/tags">Tags@if(repository.tags.length > 0){ <span class="badge">@repository.tags.length</span>}</a></li>
|
<li@if(active=="tags" ){ class="active"}><a href="@url(repository)/tags">Tags@if(repository.tags.length > 0){ <span class="badge">@repository.tags.length</span>}</a></li>
|
||||||
<li class="pull-right">
|
<li class="pull-right">
|
||||||
<div class="input-append">
|
<div class="input-append">
|
||||||
<input type="text" value="@repository.url" id="repository-url" readonly>
|
<input type="text" value="@repository.url" id="repository-url" readonly>
|
||||||
|
|||||||
@@ -13,8 +13,7 @@
|
|||||||
<label for="description"><strong>Description</strong></label>
|
<label for="description"><strong>Description</strong></label>
|
||||||
<input type="text" name="description" id="description" style="width: 600px;" value="@repository.repository.description"/>
|
<input type="text" name="description" id="description" style="width: 600px;" value="@repository.repository.description"/>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
<hr>
|
<fieldset class="margin">
|
||||||
<fieldset>
|
|
||||||
<label for="defaultBranch"><strong>Default Branch</strong></label>
|
<label for="defaultBranch"><strong>Default Branch</strong></label>
|
||||||
<select name="defaultBranch" id="defaultBranch">
|
<select name="defaultBranch" id="defaultBranch">
|
||||||
@repository.branchList.map { branch =>
|
@repository.branchList.map { branch =>
|
||||||
@@ -22,7 +21,6 @@
|
|||||||
}
|
}
|
||||||
</select>
|
</select>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
<hr>
|
|
||||||
<fieldset class="margin">
|
<fieldset class="margin">
|
||||||
<label>
|
<label>
|
||||||
<input type="radio" name="isPrivate" value="false"
|
<input type="radio" name="isPrivate" value="false"
|
||||||
|
|||||||
@@ -81,11 +81,11 @@
|
|||||||
<servlet>
|
<servlet>
|
||||||
<servlet-name>H2Console</servlet-name>
|
<servlet-name>H2Console</servlet-name>
|
||||||
<servlet-class>org.h2.server.web.WebServlet</servlet-class>
|
<servlet-class>org.h2.server.web.WebServlet</servlet-class>
|
||||||
<!--
|
|
||||||
<init-param>
|
<init-param>
|
||||||
<param-name>webAllowOthers</param-name>
|
<param-name>webAllowOthers</param-name>
|
||||||
<param-value></param-value>
|
<param-value></param-value>
|
||||||
</init-param>
|
</init-param>
|
||||||
|
<!--
|
||||||
<init-param>
|
<init-param>
|
||||||
<param-name>trace</param-name>
|
<param-name>trace</param-name>
|
||||||
<param-value></param-value>
|
<param-value></param-value>
|
||||||
@@ -99,4 +99,11 @@
|
|||||||
<url-pattern>/console/*</url-pattern>
|
<url-pattern>/console/*</url-pattern>
|
||||||
</servlet-mapping>
|
</servlet-mapping>
|
||||||
|
|
||||||
|
<!-- ===================================================================== -->
|
||||||
|
<!-- Session timeout -->
|
||||||
|
<!-- ===================================================================== -->
|
||||||
|
<session-config>
|
||||||
|
<session-timeout>1440</session-timeout>
|
||||||
|
</session-config>
|
||||||
|
|
||||||
</web-app>
|
</web-app>
|
||||||
Reference in New Issue
Block a user