Today I managed to make quite a bit of progress trying to incorporate multiple ports trees into the commit processing. The diff is about 985 lines long. It’s not as complex as it sounds. I just have to pass $CommitBranch around to various functions.
The result: I have the commits going into the database, but not all the associated processing is completed. For example, dependencies are not recorded properly.
The database now has the ability to hold multiple ports on multiple branches: However, some of the supporting functions work on category/port and cannot distinguish between the above two ports. They are going to fail. For example, when I go to add dependencies to this port, it errors out with duplicate key: I think the cause of this problem is this function: Looking at the code, I see this: See that hardcoded path on line 8? That’s what we have to cope with. There is another function, which takes two parameters: This function is also suspect: Also on my list are: I have to figure out a way for these functions to know which BRANCH we are working on. That may involve a global setting, a parameter, a setting… I’m not sure yet. What I do know for sure is that’s going to have to wait for another day.
freshports.org=# select id, name, category, element_id, element_pathname(element_id) from ports_active where name = 'spellathon';
id | name | category | element_id | element_pathname
-------+------------+----------+------------+-----------------------------------------------
24964 | spellathon | games | 324899 | /ports/head/games/spellathon
34159 | spellathon | games | 559872 | /ports/branches/RELENG_9_1_0/games/spellathon
(2 rows)
freshports.org=#
freshports.org=# SELECT PortsDependenciesAdd( 'games/spellathon', 'devel/libpthread-stubs', 'L' );
ERROR: duplicate key value violates unique constraint "port_dependencies_pkey"
DETAIL: Key (port_id, port_id_dependent_upon, dependency_type)=(24964, 19850, L) already exists.
CONTEXT: SQL statement "INSERT INTO port_dependencies (port_id, port_id_dependent_upon, dependency_type)
VALUES (l_PortID, l_PortIDDependency, p_DependencyType)"
PL/pgSQL function portsdependenciesadd(text,text,text) line 19 at SQL statement
freshports.org=#
select GetPort('games/spellathon');
getport
---------
24964
(1 row)
CREATE OR REPLACE FUNCTION GetPort(text) RETURNS int4 AS $$
DECLARE
category_port ALIAS for $1;
pathname text;
port_element_id int4;
port_id int4;
BEGIN
pathname := '/ports/head/' || category_port;
port_element_id := Pathname_ID(pathname);
if port_element_id IS NOT NULL THEN
select id
into port_id
from ports
where element_id = port_element_id;
END IF;
return port_id;
END;
$$ LANGUAGE 'plpgsql';
CREATE OR REPLACE FUNCTION GetPort(text, text) RETURNS int4 AS $$
DECLARE
p_Category ALIAS for $1;
p_Port ALIAS for $2;
l_port_id int4;
BEGIN
SELECT id
INTO l_port_id
FROM ports_active
WHERE name = p_Port
AND category = p_Category;
RETURN l_port_id;
END;
$$ LANGUAGE 'plpgsql' STABLE;
CREATE OR REPLACE FUNCTION GetPortID(text, text) returns bigint AS $$
DECLARE
CategoryName ALIAS for $1;
PortName ALIAS for $2;
CategoryID int8;
IsPrimary boolean;
PortID int8;
BEGIN
SELECT id, is_primary
INTO CategoryID, IsPrimary
FROM categories
WHERE name = CategoryName;
IF FOUND THEN
IF IsPrimary THEN
SELECT ports_all.id
INTO PortID
FROM ports_all, categories
WHERE ports_all.category_id = categories.id
AND ports_all.name = PortName
AND categories.id = CategoryID;
ELSE
SELECT ports_all.id
INTO PortID
FROM ports_categories, ports_all
WHERE ports_categories.port_id = ports_all.id
AND ports_categories.category_id = CategoryID
AND ports_all.name = PortName;
END IF;
ELSE
END IF;
return PortID;
END
$$ LANGUAGE 'plpgsql';
What’s next?
I think I’ve found the solution to my global variable issue with branches. http://www.depesz.com/2009/08/20/getting-session-variables-without-touching-postgresql-conf/